Пользовательский фильтр AngularJS для текста/числа

Я пытаюсь написать свой первый пользовательский фильтр для AngularJS. Я хочу иметь возможность определить, является ли что-то строкой или числом. Если это число, оно форматируется как таковое с помощью встроенного фильтра | number.

В настоящее время у меня есть обходной путь с использованием ng-if:

HTML

<table>
   <tr ng-repeat="(key, val) in data">
      <td>{{key}}</td>
      <td ng-if="isNumber(val)">{{val | number}}</td>
      <td ng-if="!isNumber(val)">{{val}}</td>
   </tr>
</table>

Контроллер:

$scope.data = { 
    One:55689, 
    two:"consider all the options",
    three:800243,
    four:"all over",
    five:"or just beginning"
  };

  $scope.isNumber = function (value) {
    return angular.isNumber(value);
  };

Я подумал, что было бы лучшим решением назначить его в качестве собственного фильтра. Это то, что у меня есть до сих пор (да, я знаю, что это голые кости... это мой первый).

.filter('textOrNumber',function(){
    return function (input) {
        if(typeof input === 'number'){
            console.log("I'm a number");
            //return as formatted number
        } else {
            console.log("Not a number");
            //do nothing, just return
        };
        return input;
    };
})

Когда он подтвердит, что это число, могу ли я просто применить фильтр Angular | number? Или мне нужно вручную сделать фильтр с помощью javascript?


person EnigmaRM    schedule 21.06.2013    source источник


Ответы (1)


Я бы внедрил службу $filter, а затем программно вызвал бы фильтр номеров следующим образом:

angular.module('filters', []).
filter('textOrNumber', ['$filter', function ($filter) {
    return function (input, fractionSize) {
        if (isNaN(input)) {
            return input;
        } else {
            return $filter('number')(input, fractionSize);
        };
    };
}]);

Таким образом, вы сможете использовать свой фильтр textOrNumber следующим образом:

{{myText|textOrNumber:4}}

Здесь работает JSFiddle.

person PrimosK    schedule 21.06.2013
comment
Это точно правильно. Я знал, что это может быть так просто. Я не смотрел на $filter. Я должен буду сделать это, чтобы лучше понять, на что он способен. - person EnigmaRM; 21.06.2013