创建自定义角度滤镜

时间:2015-02-16 19:15:34

标签: javascript angularjs filter angular-filters

我有一个json项目和条形码扫描仪,条形码扫描仪直接输入我的应用程序。

现在这些物品有一个主要部件号和一个次要部件号,条形码扫描器的结果往往是主要部件号,但我必须同时检查两者。

我正在尝试实现一个自定义过滤器来执行此操作,但它似乎不起作用,任何人都可以让我知道我做错了什么?

 storeApp.filter('barcodeScanner', function() {
                return function(parts, barcode) {
                   angular.forEach(parts, function (vals, key) {
                       if( !angular.isUndefined(vals.Part_Number) && vals.Part_Number !== null  )
                            if (angular.equals(vals.Part_Number,barcode)) 
                                return parts[key];
                   });
                   angular.forEach(parts, function(vals, key) {
                        if ( !angular.isUndefined(vals.Other_Part_Number) && vals.Other_Part_Number !== null )
                            if (angular.equals(vals.Other_Part_Number,barcode)) 
                                return parts[key];
                   });
                };
            });  
然后我会在控制器中调用过滤器,

$scope.addItemToCart = function() {
                   $scope.shoppingCart.push($filter('barcodeScanner')($scope.parts, $scope.ItemToAdd));
                   console.log($scope.Cart.itemToAdd);
                   console.log($filter('barcodeScanner')($scope.parts, $scope.Cart.itemToAdd));
                   $scope.Cart.itemToAdd = "";
                   console.log($scope.shoppingCart);
                };

然而,过滤器的结果保持返回undefined。我知道一个事实,我想要的条目确实存在,因为当我使用普通的$ filter('过滤器')它工作正常,但我不能冒这样广泛的过滤器为我的应用程序。

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

而不是.equals您需要检查==,因为string不会完全等于number

angular.equals只是强烈检查javascript ===,检查两个值是否与其类型相同。

if(angular.equals(vals.Other_Part_Number,barcode))

已更改为

if(vals.Other_Part_Number == barcode)

如果您想严格检查,则需要使用parseInt将值转换为数字,然后检查

if(angular.equals(parseInt(vals.Other_Part_Number),parseInt(barcode)))

希望这可以帮到你。感谢。

答案 1 :(得分:1)

我认为问题出在你职能的forEach部分。 forEach函数不返回值。您正在向迭代器函数返回一个值,因为forEach没有从迭代器返回返回的值,那么您将无法在$scope.shoppingCart.push($filter('barcodeScanner')($scope.parts, $scope.ItemToAdd));

中推送任何内容。

保存到变量ie。在匿名工厂(包装器)函数内声明matchedPart并将其返回到forEach函数之外应该解决undefined:

 storeApp.filter('barcodeScanner', function() {
            return function(parts, barcode) {

                // declare a variable here
                   var matchedPart;

               angular.forEach(parts, function (vals, key) {
                   if( !angular.isUndefined(vals.Part_Number) && vals.Part_Number !== null  )
                        if (angular.equals(vals.Part_Number,barcode)) 
                           // save it to new variable  
                           matchedPart = parts[key];
               });
               angular.forEach(parts, function(vals, key) {
                    if ( !angular.isUndefined(vals.Other_Part_Number) && vals.Other_Part_Number !== null )
                        if (angular.equals(vals.Other_Part_Number,barcode)) 
                            // save it to new variable  
                           matchedPart = parts[key];
               });
                  // return it outside the forEach function  
                  return matchedPart;
            };
        }); 

最后一点: 我还认为你应该通过结合你的forEach函数来重构。没有2个独立的。将isUndefined检查与!angular.isUndefined(vals.Part_Number) && !angular.isUndefined(vals.Other_Part_Number) && vals.Part_Number...

结合使用