是否可以在Ember.js中使用订阅者/观察者模式?例如,视图A和视图B都侦听模型C内的更改。这要求模型C能够触发自定义事件。我一直试图弄清楚如何在Ember.js中制作一个模型触发事件,但到目前为止还没有运气。
答案 0 :(得分:3)
我相信您正在寻找的功能在Ember.js中被称为“Bindings”。
主页上有大量的例子描述了如何做你的建议,但这里有一个简短的回顾:
window.MyApp = Ember.Application.create();
MyApp.MyModel = Ember.Object.create({
myProperty: "Hello World!",
goodbye: function() {
this.set("myProperty", "Goodbye!");
})
});
MyApp.modelInstance = MyApp.MyModel.create();
现在在<body>
标记中创建两个视图:
<script type="text/x-handlebars">
View1: <b>{{MyApp.modelInstance.myProperty}}</b>
</script>
<script type="text/x-handlebars">
View2: <b>{{MyApp.modelInstance.myProperty}}</b>
</script>
现在页面应该渲染,你会看到两个视图都说“Hello World!”。打开控制台并键入
MyApp.modelInstance.goodbye();
你会看到你的意见改变,说“再见!”。
视图通过使用双花括号自动创建绑定到MyApp.modelInstance.myProperty
,但您可以通过各种方式创建绑定。每当myProperty
的值发生更改时,所有绑定都将自动更新。但请注意,您必须调用set("myProperty", "something new")
以便Ember知道为您更新绑定;如果您只是说myProperty = "something new"
,它就不会触发任何更改事件。
答案 1 :(得分:0)
至少在Sproutcore中,这就是绑定的目的。
如果您有型号
App.Person = SC.Object.extend({
name: 'Bruce Banner'
});
然后你会有一个控制器,如
App.personController = SC.ObjectController.create();
然后,您可以在控制器上设置内容
App.personController.set('content', somePerson);
现在,任何视图都可以绑定到模型对象上的数据。
SC.LabelView = SC.LabelView.extend({
...
valueBinding: 'App.personController.name'
})
所以如果你改名了
somePerson.set('name', 'Chris');
视图会自动更新。