但是觉得这样行吗?自己思索半天觉得也不是很靠谱,希望各位兄弟姐妹不吝教诲!## 标题
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
<input id="app" my-model="text" />
var scope = {}; var input = document.getElementById('app');
这个很简单,编译指令myModel的时候绑定事件即可
input.addEventListener('input', function (e) { scope.text = e.currentTarget.value; },false);
scope内部有个watchers和digest
scope.$$watchers = []; scope.$$watchers.push({ key:'text', fn: function (value) { input.value = value; } }); scope.$digest = function () { scope.$$watchers.forEach(function (watcher) { watcher.fn(scope.text); }); };
当我们给scope赋值的时候在触发digest,那么UI就会同步更新了
scope.text ='zzz'; scope.$digest();
直接给scope赋值并不会更新UI,只有触发了digest,angualr才会去更新UI,大部分情况下angular帮我们主动触发了digest,给人的印象好像我们随便给scope就可以了,结果出现自己理解不了的情况。例如
angular.module('myApp', []) .controller('MyCtrl', function ($scope) { setTimeout(function () { $scope.text = 'zzz'; }, 1000); });
直接使用setTimeout,结果UI就是不更新,需要我们做如下处理
angular.module('myApp', []) .controller('MyCtrl', function ($scope) { setTimeout(function () { $scope.$apply(function () { $scope.text = 'zzz'; }); }, 1000); });
或者使用angular的$timeout,它帮我们触发了digest
angular.module('myApp', []) .controller('MyCtrl', function ($scope,$timeout) { $timeout(function () { $scope.text = 'zzz'; }, 1000); });
搜索一下吧 很多文章可以给你解惑 先搜索再提问
首先声明一点,我对于题主提到的angularjs不太熟悉,有点不对题。knockout也有同样的数据数据双向绑定的特性,它是以观察者模式进行实现的,创建被观察的对象后,使用set方法赋值的时候,同时通知对该对象感兴趣的观察者,以此来达到数据双向绑定的效果。
angular1 是脏检查。。也因为这个带来了性能的问题
AngularJS 是如何实现其双向数据绑定机制的?
可以参考:http://teropa.info/build-your-own-angular/build_your_own_angularjs_sample.pdf
实现一个类似双向绑定的简单例子
HTML
SCRIPT
视图变化更新数据
这个很简单,编译指令myModel的时候绑定事件即可
数据变化更新UI
scope内部有个watchers和digest
当我们给scope赋值的时候在触发digest,那么UI就会同步更新了
直接使用setTimeout,结果UI就是不更新,需要我们做如下处理
或者使用angular的$timeout,它帮我们触发了digest
搜索一下吧 很多文章可以给你解惑 先搜索再提问
首先声明一点,我对于题主提到的angularjs不太熟悉,有点不对题。
knockout也有同样的数据数据双向绑定的特性,它是以观察者模式进行实现的,创建被观察的对象后,使用set方法赋值的时候,同时通知对该对象感兴趣的观察者,以此来达到数据双向绑定的效果。
angular1 是脏检查。。也因为这个带来了性能的问题
AngularJS 是如何实现其双向数据绑定机制的?
可以参考:
http://teropa.info/build-your-own-angular/build_your_own_angularjs_sample.pdf