在AngularJS中有没有一种方法可以在不使用$watch的情况下对模型变化做出反应?
Is there a way in AngularJS to react on model changes without using $watch?
我正在AngularJS中实现一个简单的旋转控件,我想对用户输入和+/-按钮的更改做出反应。这是我的HTML:
<input type='button' ng-click="MyProperty = MyProperty - 1" value="-">
<input type='text' ng-model="MyProperty" ng-change="log('changed from ngChange')">
<input type='button' ng-click="MyProperty = MyProperty + 1" value="+">
但这将只跟踪'用户更改',因为ngChange
只支持用户交互更新,根据文档
现在我在看Frederik推荐的$scope.$watch
:
$scope.$watch('MyProperty', function() {
$scope.log('changed from $watch');
});
参见活塞演示
但这似乎不够正确。
- 首先它不是声明性的,你必须搜索
MyTestProperty
代码来找到这个绑定。 - 如果你想把
$scope.log
放在一个单独的模型中,你必须要么注入$scope
,要么在控制器中做绑定。据我所知,这两种方法都不被认为是最佳做法。
$watch
总的来说是一件坏事,原因有很多。但这里建议的解决方案(即在ngClick中直接调用log
)对我来说并没有太大的不同。基本上,你必须手动跟踪所有的更改,如果有新的actor出现,你必须复制你的逻辑。
所以的问题将是:有没有一种方法,可以让你自动跟踪模型更新没有$watch?如果有这样的方法来实现你自己的指令,这个想法有多糟糕?
有几种方法可以做到这一点,但最优雅的方法是要求输入的ngModel,然后使用它来查看/操作值。
这里是你的更新砰砰作响。
.directive('outputIt', function() {
return {
restrict: 'A',
scope: {
outputIt: '&'
},
require: '?ngModel',
link: function(scope, element, attrs, ngModelCtrl) {
ngModelCtrl.$parsers.push(function(val) {
//console.log("the model was changed by input")
scope.outputIt()(val);
});
ngModelCtrl.$formatters.push(function(viewValue) {
//console.log("the model was changed from outside.");
scope.outputIt()(viewValue);
return viewValue;
});
}
}
})
想了解更多,这里有一篇很酷的文章:为
祝你好运!
您研究过ES5的方式吗?它本质上是javascript的原生$watch功能。不同之处在于,set/get函数被封装在属性中,而$watch可以应用于外部的任何地方。
var MyCtrl = function(){
this._selectedItem = null;
};
Object.defineProperty(MyCtrl.prototype, "selectedItem", {
get: function () {
return this._selectedItem;
},
set: function (newValue) {
this._selectedItem = newValue;
//Call method on update
this.onSelectedItemChange(this._selectedItem);
},
enumerable: true,
configurable: true
});
当然可以使用:
<input type="number" />
这将创建一个spinner =)
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- AngularJS:在没有$watch的情况下观察变量
- 如何让 Grunt/Watch/LiveReload 在不刷新整页的情况下重新加载 Sass/CSS
- 在不阻塞终端的情况下运行Grunt Watch
- 在AngularJS中有没有一种方法可以在不使用$watch的情况下对模型变化做出反应?
- Gulp-watch在不更改文件的情况下无休止地编译
- Angular UI Router 1.0——为什么在不离开state的情况下调用$scope.$watch('
- 为什么AngularJS在什么都没改变的情况下会触发$watch ?