我在Stack Overflow上搜索了一下,没有找到任何好的答案.
我所相信的是,数据绑定是一个通用术语,有不同的实现方式,如观察者模式或发布/子模式.使用Observer模式,Observable更新其观察者.使用Pub/Sub,0-many发布者可以发布某些类的消息,0-many订阅者可以订阅某些类的消息.
是否有其他实施"数据绑定"的模式?
data-binding model-view-controller design-patterns publish-subscribe observer-pattern
几个月前,我决定研究Angular.当我做一些进步并使用它创建一些应用程序时,我意识到Angular 2处于开发人员预览中,因此它将在它发布之前的时间问题.因为Angular 2不会与Angular 1兼容,并且有很多变化,问题是,继续使用Angular 1.x开发还是开始开发Angular 2会更好吗?
事实上,我们并不总是必须使用市场上的最新版本或最新语言,但在这种情况下,应用程序仍然很小,所以我可以毫无问题地进行更改.
请务必阅读以下所有评论.不推荐使用Object.Watch和Object.Observe.请参阅Elliot B对更新(截至2018年6月)方法的评论.
我一直在寻找一种简单的方法来监控对象或变量的变化,我发现Object.Watch,Mozilla浏览器支持这种方式,但IE不支持.所以我开始四处寻找,看是否有人写过某种等价物.
关于我发现的唯一一件事是jQuery插件,但我不确定这是不是最好的方法.我当然在大多数项目中都使用jQuery,所以我并不担心jQuery方面......
无论如何,问题是:有人能告诉我一个jQuery插件的工作示例吗?我有问题让它工作......
或者,是否有人知道任何可以跨浏览器工作的更好的替代品?
答案后更新:
谢谢大家的回复!我试过这里发布的代码:http: //webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html
但我似乎无法使其与IE一起工作.下面的代码在Firefox中运行良好,但在IE中没有任何作用.在Firefox中,每次Object.Observe更改Object.watch()时watcher.status都会调用in ,您可以在页面上看到输出.在IE中,这不会发生,但我可以看到document.write()更新值,因为最后一次watcher.watch()调用显示正确的值(在IE和FF中).但是,如果没有调用回调函数,那那就毫无意义...... :)
我错过了什么吗?
var options = {'status': 'no status'},
watcher = createWatcher(options);
watcher.watch("status", function(prop, oldValue, newValue) {
document.write("old: " + oldValue + ", new: " + newValue + "<br>");
return newValue;
});
watcher.status = 'asdf';
watcher.status = '1234';
document.write(watcher.status + "<br>");
Run Code Online (Sandbox Code Playgroud) 我想重复创建div,这些项是函数返回的对象.但是,以下代码报告错误:达到10 $ digest()迭代.中止!jsfiddle在这里:http://jsfiddle.net/BraveOstrich/awnqm/
<body ng-app>
<div ng-repeat="entity in getEntities()">
Hello {{entity.id}}!
</div>
</body>
Run Code Online (Sandbox Code Playgroud) 这是我的HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
Run Code Online (Sandbox Code Playgroud)
当我在框中输入时,模型通过双向绑定机制进行更新.甜.
但是,当我通过JQuery这样做...
$('#selectedDueDate').val(dateText);
Run Code Online (Sandbox Code Playgroud)
它不会更新模型.为什么?
将AngularJS与其他JavaScript-MVC框架区分开来的一件事是它能够使用绑定将绑定值从JavaScript回显到HTML.当您为$ scope变量赋值时,Angular会"自动"执行此操作.
但这有多自动?有时,Angular不会接受更改,所以我需要调用$ scope.$ apply()或$ scope.$ digest()来通知angular拾取更改.有时,当我运行这些方法中的任何一个时,它会抛出一个错误,并表示摘要已在进行中.
由于绑定({{}}括号或ng-属性内的任何内容)都与eval一起回应,这意味着Angular会不断轮询$ scope对象以查找更改,然后执行eval将这些更改推送到DOM/HTML?或者AngularJS以某种方式找出了使用魔术变量来触发变量值变化或分配时触发的事件?我从来没有听说过所有浏览器都完全支持它,所以我对此表示怀疑.
AngularJS如何跟踪它的绑定和范围变量?
我对我的AngularJS应用程序有一个想法,我很好奇AngularJS社区是否会认为可以这样做...
简而言之,我正在连接到数据API并在页面上显示我的结果.我创建了一个角度服务,在$ rootScope.DataStore上创建数据存储.我还有一个服务方法,它使用API端点返回的数据更新DataStore.如果我使用DataStore.update('products')从我的控制器内部请求"products"API端点,这将使用我的产品数据更新$ rootScope.DataStore.products.现在,在视图/部分中,我需要做的就是说ng-repeat ="DataStore.products中的产品"来显示我的数据,并且我在哪个控制器范围并不重要.所以,本质上我的DataStore是我唯一的真相来源.
我觉得从这种方法中获得的东西很容易遵循语义和最小的控制器编码.因此,无论何时更新DataStore,任何绑定到DataStore的内容也都会更新.
这会给$ rootScope摘要周期带来太多负担,还是这只是一种奇怪的方式呢?或者它是一个非常棒的方式?:)欢迎任何评论.
我现在正在阅读很多关于AngularJS的内容,并且我遇到了神奇的$ watch功能.我理解如何使用它,但我想知道它是如何在后台实现的.它是时间间隔功能吗?或者是Angular在每次执行声明时都会调用此表吗?
我现在不想深入研究源代码,如果你们中的一个人已经知道答案并希望分享他对这个主题的了解,我会很高兴.
谢谢.
我们正在为一家银行建立的Angular应用程序冲击性能问题.
不幸的是,显示代码片段是违反合同的行为.无论如何,我可以描述一些正在发生的主要问题,我希望可以推荐最佳实践.
应用结构:
如果你看一下时间表.我们花了很多时间在jQuery解析html方法,jQuery重新计算stye方法,GC事件(垃圾收集).我想最小化这些应该可以加快速度.它们都是Angular生命周期的一部分,但可能有更好的方法来避免它们.以下是探查器的一些截图:

最终,随着重复形式的数量超过5,应用程序缓慢.每种形式与其他形式相对无关.我们已经尝试不在表单之间查看任何共享属性.
performance html5 angularjs angularjs-scope angularjs-ng-repeat
angularjs ×8
javascript ×3
data-binding ×2
jquery ×2
angular ×1
dom-events ×1
html5 ×1
performance ×1