Angular JS中的双向绑定
Two way binding in Angular JS
我在以下代码中遇到问题。
我的网页代码:
<body ng-app="myapp">
<div ng-controller="myController">
The message is {{message}}
<input type="button" value="Change Message" ng-click="changeMessage()">
</div>
我的控制器代码:
app.controller('myController',function($scope)
{
$scope.changeMessage=function()
{
setTimeout(function(){
console.log("Message changed");
$scope.message="Hurray !!! New Message";
},3000);
$scope.newMessage=function()
{
$scope.message="hello";
console.log("new message");
};
但是,如果我使用 changeMessage 函数,即使控制台.log消息来了,我也无法看到更改的消息属性。在这两种情况下,这里都缺少什么。
提前致谢
更改未反映在视图中的原因是,由于赋值是在 setTimeout
的回调中完成的,这导致角度没有注意到更改。这与所谓的digest
周期有关。有不同的方法可以解决这个问题。
使用$scope.$apply()
包装作业
甚至更好地使用Angular提供的现有$timeout
服务,而不是已经为您处理上述问题的setTimeout
调用。
有关详细信息,请参阅$timeout的用法 https://docs.angularjs.org/api/ng/service/$timeout
https://docs.angularjs.org/api/ng/type/$rootScope.Scope$apply背后的原因。
对这里发生的事情的一般解释在 http://www.sitepoint.com/understanding-angulars-apply-digest/
每个更改都应该发生在一个角度摘要周期内。 如果您从外部更改值(这正是发生的情况,如果您使用setTimeout
而不是 Angular 的$timeout
),则在下一个摘要周期 (https://www.ng-book.com/p/The-Digest-Loop-and-apply/) 之前不会更新您的视图。 因此,在您的情况下,message
已经设置,但视图尚未更新。
尝试这样的事情:
app.controller('myController', function($scope, $timeout) {
$scope.changeMessage = function() {
$timeout(function(){
console.log("Message changed");
$scope.message="Hurray !!! New Message";
}, 3000);
$scope.newMessage=function() {
$scope.message="hello";
console.log("new message");
};
在超时完成后使用 $digest():
$scope.changeMessage=function()
{
setTimeout(function(){
$scope.message="Hurray !!! New Message";
$scope.$digest();
},3000);
}
请注意,使用 $digest 比使用 $apply(与性能相关)要好得多:
scope.$digest() 将在当前作用域及其所有子作用域上触发监视程序。 scope.$apply 将计算传递的函数并运行 $rootScope.$digest()
- react.js中的密钥绑定
- 如何销毁/删除/取消绑定SnapSVG.js
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 淘汰赛.JS'启用'长度绑定条件不起作用
- Backbone.js将模型绑定到视图时出错
- 使用knockout.js将数组绑定到视图模型
- 如何使用Jasmine测试Knockout.js点击绑定
- 在offline.js中绑定事件
- Ember.js:将Em.$.getJSON转换为promise并将响应绑定到控制器上下文的正确方法
- 基本D3.js:如何将具有其他属性的数据绑定到元素
- 是否可以为React'打开React.js自动绑定;s类模型
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- knockout.js中的绑定多下拉列表
- 一种将Apache Thrift JS绑定与Backbone.JS一起使用的方法
- 为SEO的数据绑定JS预加载数据
- C3 中的双向数据绑定.js AngularJS 中的双向数据绑定
- 用于绑定 JS 对象以进行回调的解决方案
- 如何解绑定JS bundle文件
- 根据鼠标位置绑定js事件:性能杀手与否