ng-Repeat 在 1.3.x 但在 1.2.1 中不使用 Custom ValueFilter (Value | customFilter)
ng-Repeat not working with Custom ValueFilter (Value | customFilter) in 1.3.x but in 1.2.1
我正在尝试将解决方案从 1.2.1 更新到 1.3.15,但我卡住了,似乎摘要循环 运行 通过循环的方式发生了变化。
我有一个工厂,它为我的所有控制器保存数据,它有一个对象列表和一个当前对象 属性。它用于货币转换。
然后我得到了一个可以放在数字值上的过滤器。它引用工厂并使用当前 属性 获取转换率并修改输出。
价值=1000;当前 = kiloCurrency = 1000 => {值 | bvcurrency} 输出:1;
有一个更改当前货币的功能,过滤器应该更新 output.This 在 1.2.1 中工作正常但在 1.3.x
我有一些例子:
不工作 1.3.15:http://jsfiddle.net/dabii/mqkj4td9/7/
工作:1.2.1:http://jsfiddle.net/dabii/mqkj4td9/8/
app.factory("numberSvc", [function () {
return {
Formats: [{
Display: "LC",
Multiply: 1
}, {
Display: "kLC",
Multiply: 1000
}, {
Display: "MLC",
Multiply: 1000000
}],
Current: {
Display: "kLC",
Multiply: 1000
},
AddCurrency:function(curr){
this.Formats.push(curr);
},
SetCurrent: function(format){
this.Current = format;
}
};
}]);
app.filter('bvcurrency', ['$filter', 'numberSvc', function ($filter, numberSvc) {
return function (input) {
var multi = numberSvc.Current.Multiply,
ret = ( !! input || input === 0) && angular.isNumber(parseFloat(input)) ? $filter('number')(input / multi, 0) : "";
return ret;
};
}]);
通过按下按钮,您可以看到出厂值发生了变化,但使用过滤器的那个没有变化,既没有自动也没有重复。如果我通过更改值强制摘要,则重复外部的值将更改但内部不会更改。
似乎有某种 "intelligent" 摘要 运行ning 并且看到 repeat 中的值没有改变,因此不会 运行 他们的摘要。但它看不到输出会发生变化,因为它没有考虑过滤器。
有人可以指出正确的方向让它在 1.3.1 中工作吗?或者告诉我错误?
亲切的问候
拉斐尔
默认情况下过滤器被认为是无状态的,即输出值仅取决于输入值。这给了 Angular 优化的机会:只要输入值不变,就不必重新计算输出值。此行为已随 1.3 更改。
您的过滤器是有状态的,因此您必须添加 $stateful
标志才能让 Angular 知道。
app.filter('bvcurrency', ['$filter', 'numberSvc', function ($filter, numberSvc) {
function filter(input) {
var multi = numberSvc.Current.Multiply,
ret = ( !! input || input === 0) && angular.isNumber(parseFloat(input)) ? $filter('number')(input / multi, 0) : "";
return ret;
};
filter.$stateful = true;
return filter;
}]);
我正在尝试将解决方案从 1.2.1 更新到 1.3.15,但我卡住了,似乎摘要循环 运行 通过循环的方式发生了变化。
我有一个工厂,它为我的所有控制器保存数据,它有一个对象列表和一个当前对象 属性。它用于货币转换。
然后我得到了一个可以放在数字值上的过滤器。它引用工厂并使用当前 属性 获取转换率并修改输出。
价值=1000;当前 = kiloCurrency = 1000 => {值 | bvcurrency} 输出:1;
有一个更改当前货币的功能,过滤器应该更新 output.This 在 1.2.1 中工作正常但在 1.3.x
我有一些例子:
不工作 1.3.15:http://jsfiddle.net/dabii/mqkj4td9/7/
工作:1.2.1:http://jsfiddle.net/dabii/mqkj4td9/8/
app.factory("numberSvc", [function () {
return {
Formats: [{
Display: "LC",
Multiply: 1
}, {
Display: "kLC",
Multiply: 1000
}, {
Display: "MLC",
Multiply: 1000000
}],
Current: {
Display: "kLC",
Multiply: 1000
},
AddCurrency:function(curr){
this.Formats.push(curr);
},
SetCurrent: function(format){
this.Current = format;
}
};
}]);
app.filter('bvcurrency', ['$filter', 'numberSvc', function ($filter, numberSvc) {
return function (input) {
var multi = numberSvc.Current.Multiply,
ret = ( !! input || input === 0) && angular.isNumber(parseFloat(input)) ? $filter('number')(input / multi, 0) : "";
return ret;
};
}]);
通过按下按钮,您可以看到出厂值发生了变化,但使用过滤器的那个没有变化,既没有自动也没有重复。如果我通过更改值强制摘要,则重复外部的值将更改但内部不会更改。
似乎有某种 "intelligent" 摘要 运行ning 并且看到 repeat 中的值没有改变,因此不会 运行 他们的摘要。但它看不到输出会发生变化,因为它没有考虑过滤器。
有人可以指出正确的方向让它在 1.3.1 中工作吗?或者告诉我错误?
亲切的问候
拉斐尔
默认情况下过滤器被认为是无状态的,即输出值仅取决于输入值。这给了 Angular 优化的机会:只要输入值不变,就不必重新计算输出值。此行为已随 1.3 更改。
您的过滤器是有状态的,因此您必须添加 $stateful
标志才能让 Angular 知道。
app.filter('bvcurrency', ['$filter', 'numberSvc', function ($filter, numberSvc) {
function filter(input) {
var multi = numberSvc.Current.Multiply,
ret = ( !! input || input === 0) && angular.isNumber(parseFloat(input)) ? $filter('number')(input / multi, 0) : "";
return ret;
};
filter.$stateful = true;
return filter;
}]);