如何做双向的AngularJS过滤?(How to do two-way filtering in

2019-06-17 12:21发布

一个有趣的事情AngularJS可以做的是一个过滤器适用于特定的数据绑定表达式,它是应用方便的方式,例如,一个模型的属性区域性特定货币或日期格式。 这也是不错的,在计算范围性能。 问题是,没有这些功能具有双向数据绑定方案的工作 - 从范围到视图只能单向绑定。 这似乎是一个明显的遗漏在另外优库 - 还是我失去了一些东西?

在KnockoutJS ,我可以创建一个读/写性能计算,这让我指定一对函数,一个被称为获取属性的值,和一个当该属性设置被调用。 这让我来实现,例如,文化意识的输入 - 让用户键入“$ 1.24”,并对其进行解析时到视图模型的浮动,并在视图模型的变化体现在输入。

我能找到类似这样的最接近的事是使用$scope.$watch(propertyName, functionOrNGExpression); 这让我有一个函数调用的物业时$scope变化。 但是,这并没有解决,例如,文化感知输入的问题。 注意问题,当我尝试修改$watched的内财产$watch方法本身:

$scope.$watch("property", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.property = Globalize.parseFloat(newValue);
});

( http://jsfiddle.net/gyZH8/2/ )

当用户开始打字输入元素获得非常困惑。 我通过分割财产成两个属性,一个用于未解析值和一个用于分析得到的值提高它:

$scope.visibleProperty= 0.0;
$scope.hiddenProperty = 0.0;
$scope.$watch("visibleProperty", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.hiddenProperty = Globalize.parseFloat(newValue);
});

( http://jsfiddle.net/XkPNv/1/ )

这是在第一个版本有所改进,但更详细一点,并注意仍然存在的问题parsedValue范围的变化特性(类型的东西在第二输入,从而改变了parsedValue直接。注意顶部输入不更新)。 这可能从一个控制器动作或从数据服务加载数据发生。

有没有实现使用AngularJS这种情况下一些更简单的方法? 我错过了文档中的某些功能?

Answer 1:

事实证明,有一个非常优雅的解决方案这一点,但它不是有据可查的。

为显示格式化模型值可以通过处理| 操作者和角formatter 。 事实证明,这不仅有格式化的名单也解析器的列表ngModel。

1.使用ng-model来创建双向数据绑定

<input type="text" ng-model="foo.bar"></input>

2.将被应用到相同的元件的角模块中创建一个指示,并且取决于上ngModel控制器

module.directive('lowercase', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attr, ngModel) {
            ...
        }
    };
});

3.在link方法,添加自定义转换到ngModel控制器

function fromUser(text) {
    return (text || '').toUpperCase();
}

function toUser(text) {
    return (text || '').toLowerCase();
}
ngModel.$parsers.push(fromUser);
ngModel.$formatters.push(toUser);

4.你的新指令添加到已经拥有相同的元素ngModel

<input type="text" lowercase ng-model="foo.bar"></input>

这里有一个工作的例子是转换文本在小写input ,并返回到大写模型

在该模式控制器API文档也有一个简要的解释和其他可用方法的概述。



文章来源: How to do two-way filtering in AngularJS?