Ember.js用于更新视图的选项

我一直在玩Ember.js ,并想知道在数据更改时更新DOM的最佳做法是什么。

具体来说,我为每个模型实例都有一个带有打开和关闭按钮的分隔符。 我希望如果模型对象的状态为“打开”,则打开按钮消失,如果模型状态为“关闭”,则关闭按钮消失。

据我所知,有几种选择。

A)在控制器调用的视图中使用jQuery直接更改DOM中的元素

B)设置一个将自动重新加载模板的观察者,并在模板中包含if/else语句,其中的内容应根据更新的模型参数进行更改。

是其中一个首选(或两者都没有)? 你们会做什么?

看看这个小提琴 ,显示在另一个视图/选项卡中实现的这个。 此示例使用简单的Em.Controller而不是Em.CollectionController ,但它Em.CollectionController您的需要。

我有2个css类:

 .visible {visibility: visible} .invisible {visibility: hidden} 

以下视图在子视图的classNameBinding上使用它们。 我将模型绑定到父视图,其中contentBinding指向控制器上的模型,然后子视图具有一个属性,该属性观察父级的currentState属性。 单击此子视图时,它会将currentState设置为“closed”,它将再次评估IsVisible方法,该方法将正确的值提供给classNameBinding。

 App.OtherView = Em.View.extend({ templateName: 'other', contentBinding: 'controller.content', currentStateBinding: 'controller.content.state', ButtonView: Ember.View.extend({ tagName: 'a', click: function(e) { this.set('parentView.currentState', 'closed'); }, classNameBindings: 'IsVisible:btn visible:invisible', IsVisible: function() { return this.get('parentView.currentState') === 'open'; }.property('parentView.currentState') }) }); 

以下是模板的设置方式

  

或者,我有这个示例 (这里是源代码 ),它与如何使用.property实现相同function的概念非常相似,但这有点复杂,而且是导航栏菜单。 检查我是如何做App.NavigationView ,你会发现一个名为NavigationItemView的子视图,我有一个classNameBinding 。 这样做是检查我的控制器中的属性值,然后检查视图。 该比较返回true或false,它将根据调用isActive函数属性的表达式填充类名,几乎与我根据您的问题编写的第一个小提琴相同。

希望这可以帮助。

我想你需要详细说明你的问题。 这是我根据您对问题的当前理解得出的答案:从我的观点来看,这两个选项都不是EmberJS的好习惯。 据我所知,它是EmberJS的优势之一,您不必担心手动更新DOM。 您需要做的就是更新模型或控制器对象,所有更改将自动传播到DOM。

最好的祝福,