【问题标题】:ng-Repeat not working with Custom ValueFilter (Value | customFilter) in 1.3.x but in 1.2.1ng-Repeat 不适用于 1.3.x 但在 1.2.1 中的自定义 ValueFilter (Value | customFilter)
【发布时间】:2015-04-15 09:53:31
【问题描述】:

我正在尝试将解决方案从 1.2.1 更新到 1.3.15,但我被卡住了,似乎摘要循环通过循环运行的方式发生了变化。

我有一个工厂,它保存所有我的控制器的数据,它有一个对象列表和一个当前对象属性。它用于货币转换。

然后我得到了一个可以放在数字值上的过滤器。它引用工厂并使用当前属性来获取转换率并修改输出。

值 = 1000;当前=千货币= 1000 => {价值| bvcurrency} 输出:1;

有一个功能可以更改当前货币,过滤器应该更新输出。这在 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;
};
}]);

通过按下按钮,您可以看到出厂值发生了变化,但使用过滤器的那个既不是 aut 也不是重复内部的值。如果我通过更改值来强制摘要,则重复外部的值将更改,但内部不会更改。

似乎有某种“智能”摘要正在运行,并且看到重复中​​的值没有改变,因此不会为它们运行摘要。但它没有看到输出会改变,因为它没有考虑过滤器。

有人可以指出正确的方向以使其在 1.3.1 中运行吗?还是告诉我错误?

亲切的问候

拉斐尔

【问题讨论】:

    标签: angularjs angularjs-ng-repeat angularjs-filter angularjs-factory


    【解决方案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;
    }]);
    

    【讨论】:

    • 非常感谢!从未遇到过无状态和有状态过滤器。
    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2015-04-24
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多