创建自定义 angular 过滤器
Creating custom 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);
};
但是过滤器的结果一直返回未定义。我知道我想要的条目确实存在,因为当我使用普通的 $filter('filter') 它工作正常,但我不能冒险为我的应用程序使用如此广泛的过滤器。
感谢您的帮助:)
而不是 .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)))
希望对您有所帮助。谢谢。
我认为问题出在函数的 forEach 部分。 forEach 函数没有 return 值。您正在 return 为您的迭代器函数赋值,并且由于 forEach 不是 return 迭代器中的 returned 值,那么您将没有任何东西可以推入您的 $scope.shoppingCart.push($filter('barcodeScanner')($scope.parts, $scope.ItemToAdd));
保存到变量即。 matchedPart
在匿名工厂(包装器)函数内声明并在 forEach 函数外 return 应该解决未定义的问题:
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...
相结合
我有 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') 它工作正常,但我不能冒险为我的应用程序使用如此广泛的过滤器。
感谢您的帮助:)
而不是 .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)))
希望对您有所帮助。谢谢。
我认为问题出在函数的 forEach 部分。 forEach 函数没有 return 值。您正在 return 为您的迭代器函数赋值,并且由于 forEach 不是 return 迭代器中的 returned 值,那么您将没有任何东西可以推入您的 $scope.shoppingCart.push($filter('barcodeScanner')($scope.parts, $scope.ItemToAdd));
保存到变量即。 matchedPart
在匿名工厂(包装器)函数内声明并在 forEach 函数外 return 应该解决未定义的问题:
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...