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。
最好的祝福,