【问题标题】:Creating custom angular filters创建自定义角度过滤器
【发布时间】:2015-04-17 09:27:45
【问题描述】:

我有一个 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);
                };

但是过滤器的结果一直返回未定义。我知道我想要的条目确实存在,因为当我使用普通的 $filter('filter') 时它工作正常,但我不能冒险为我的应用程序使用如此广泛的过滤器。

感谢您的帮助:)

【问题讨论】:

    标签: javascript angularjs filter angular-filters


    【解决方案1】:

    我相信问题出在你的函数的 forEach 部分。 forEach 函数不返回值。您正在向迭代器函数返回一个值,并且由于 forEach 没有从迭代器返回该返回值,因此您将没有什么可以推送到您的 $scope.shoppingCart.push($filter('barcodeScanner')($scope.parts, $scope.ItemToAdd));

    保存到变量,即。 matchedPart 在匿名工厂(包装器)函数内部声明并在 forEach 函数外部返回它应该解决未定义的问题:

     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...结合起来

    【讨论】:

    • Aaa 不知道无法从 forEach 中返回,我将它们分开的原因是,由于匹配主要部件号更为常见,我可以退出大多数部分的功能更快,但由于返回在迭代器中不起作用,因此将它们组合起来更有意义,谢谢:)
    【解决方案2】:

    您需要检查== 而不是.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)))

    希望这可以帮助你。谢谢。

    【讨论】:

    • 感谢您的信息,但部件号实际上存储为字符串,所以这实际上工作正常 :)
    猜你喜欢
    • 2015-10-05
    • 2020-07-27
    • 2019-02-16
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多