【发布时间】:2012-07-21 22:20:51
【问题描述】:
AngularJS 可以做的一件有趣的事情是将过滤器应用于特定的数据绑定表达式,这是一种方便的应用方式,例如,模型属性的文化特定货币或日期格式。在范围上具有计算属性也很好。问题是这些特性都不适用于双向数据绑定方案——从范围到视图只有单向数据绑定。这似乎是一个优秀图书馆的明显遗漏 - 还是我错过了什么?
在KnockoutJS 中,我可以创建一个读/写计算属性,它允许我指定一对函数,一个被调用以获取属性的值,一个在设置属性时被调用.例如,这使我能够实现文化感知输入 - 让用户键入“$1.24”并将其解析为 ViewModel 中的浮点数,并在输入中反映 ViewModel 中的更改。
我能找到与此类似的最接近的事情是使用$scope.$watch(propertyName, functionOrNGExpression); 这允许我在$scope 中的属性更改时调用一个函数。但这并不能解决例如文化感知输入问题。请注意当我尝试在 $watch 方法本身中修改 $watched 属性时出现的问题:
$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 属性的问题(在第二个输入中键入一些内容,这会更改 @987654331直接@。注意顶部输入不会更新)。这可能发生在控制器操作或从数据服务加载数据时。
有没有更简单的方法来使用 AngularJS 来实现这个场景?我是否缺少文档中的某些功能?
【问题讨论】:
标签: javascript angularjs data-binding angularjs-scope