绑定到Ember.js中集合视图中的临时属性

绑定到Ember.js中集合视图中的临时属性,ember.js,Ember.js,我试图了解在视图集合中绑定属性的最佳方法 根据您的文档,在MVC体系结构中,我们实际上应该将视图的属性绑定到控制器层,而不是直接绑定到模型实例。当我们有一个只控制单个对象的控制器时,这种方法非常有效,但当我们处理集合时,它似乎效果不太好 在cannonical ToDos示例中,您的视图是 {{#collection contentBinding="Todos.todosController" tagName="ul" itemClassBinding="content.isDone"}}

我试图了解在视图集合中绑定属性的最佳方法

根据您的文档,在MVC体系结构中,我们实际上应该将视图的属性绑定到控制器层,而不是直接绑定到模型实例。当我们有一个只控制单个对象的控制器时,这种方法非常有效,但当我们处理集合时,它似乎效果不太好

在cannonical ToDos示例中,您的视图是

{{#collection contentBinding="Todos.todosController" tagName="ul"
 itemClassBinding="content.isDone"}}
  {{view Em.Checkbox titleBinding="content.title"
    valueBinding="content.isDone"}}
{{/collection}}
这本质上是直接绑定到每个模型的属性。我知道数组控制器以某种方式代理这些属性,但您仍然只能引用直接存在于模型对象上的那些属性

比如说,在我的ToDo应用程序中,我想在视图上有更多的状态,例如,我希望它能够展开或折叠。如果有一个视图对象表示整个ToDo视图,包括扩展框架和内容,我希望该视图上的某些属性“isExpanded”绑定到某个对象

如果我只有一个对象和一个非数组控制器,我可能会在控制器中放置一个“isExpanded”属性。然后当你翻转小三角形图标时,我可以在控制器上设置这个属性,视图会注意到这一点并展开

但是,对于阵列控制器,没有明显的方法来拥有此属性并使其引用单个TODO。从上面的cannonical示例来看,似乎我必须绑定到模型上的属性。但是,将它作为一个临时的、以视图为中心的属性(如i扩展到ToDo模型本身)似乎很愚蠢


有什么建议吗?

不要在控制器上放置属性。至少在ember派生的Sproutcore中,这会导致模型状态发生更改,这是您不希望的,因为该属性不在模型上。此外,视图的扩展状态是视图关注点;模型不关心它的显示方式。保持MVC

将展开的属性放在视图本身上,并使其成为displayProperties数组中的值

每当该数组中的值发生更改时,视图应重新渲染。不管怎样,这就是我在Sproutcore会做的

更新您的评论。两种方法:

我定义如下

displayProperties: ['expand']
...
expandBinding: Em.Binding.oneWay('xyz')
根据你的观点。这样,当您的1触发器更改时,所有项目视图都将展开

2保留对视图的引用,并在状态图中,当用户单击展开按钮时,在视图上循环并设置展开属性


选项1更简单,但创建大量绑定可能会影响性能。选项2没有使用很多绑定。可能希望从选项1开始,然后如果性能有问题,请转到选项2。

不要在控制器上放置属性。至少在ember派生的Sproutcore中,这会导致模型状态发生更改,这是您不希望的,因为该属性不在模型上。此外,视图的扩展状态是视图关注点;模型不关心它的显示方式。保持MVC

将展开的属性放在视图本身上,并使其成为displayProperties数组中的值

每当该数组中的值发生更改时,视图应重新渲染。不管怎样,这就是我在Sproutcore会做的

更新您的评论。两种方法:

我定义如下

displayProperties: ['expand']
...
expandBinding: Em.Binding.oneWay('xyz')
根据你的观点。这样,当您的1触发器更改时,所有项目视图都将展开

2保留对视图的引用,并在状态图中,当用户单击展开按钮时,在视图上循环并设置展开属性


选项1更简单,但创建大量绑定可能会影响性能。选项2没有使用很多绑定。可能希望从选项1开始,然后如果性能有问题,请转到选项2。

但我如何更改视图属性?假设一个用户在应用程序的其他地方单击了一个标记名,我希望所有与该标记关联的TODO都展开。为了让这些待办事项的视图得到扩展,我应该设置什么?如果isExpanded是一个模型属性,我可以找到所有这些模型并设置该属性,所有相关视图都会得到通知。但正如我们都说的,这是一个视图问题,不属于模型。嗯。。。还是不明白。选项1不区分我要展开的视图和我不想展开的视图。我不希望它们都扩展,我只希望在我虚构的示例中,用户单击了一个标记,它们似乎应该绑定到一个可以通知它们这一点的属性。问题不在于displayProperties,我知道如何重新渲染视图。问题是我要约束什么?说“xyz”并不能回答这个问题。[所以在我准备好之前保存了我的回复,对不起。]选项2似乎更糟糕:必须维护sep似乎不是很MVC
存储在状态图或其他地方的所有模型和视图的arate数组。我从未见过有人在Ember或SC应用程序中这样做。如果没有,你只需要抓取视图。您不需要数组。至少在SC中,您可以在定义列表的页面上有一个出口,并从那里获取视图。我认为没有一个完全干净的解决方案。如果你把它放在模型上,你就破坏了MVC。如果你不这样做,你必须做更多的工作。但是我该如何改变视图属性呢?假设一个用户在应用程序的其他地方单击了一个标记名,我希望所有与该标记关联的TODO都展开。为了让这些待办事项的视图得到扩展,我应该设置什么?如果isExpanded是一个模型属性,我可以找到所有这些模型并设置该属性,所有相关视图都会得到通知。但正如我们都说的,这是一个视图问题,不属于模型。嗯。。。还是不明白。选项1不区分我要展开的视图和我不想展开的视图。我不希望它们都扩展,我只希望在我虚构的示例中,用户单击了一个标记,它们似乎应该绑定到一个可以通知它们这一点的属性。问题不在于displayProperties,我知道如何重新渲染视图。问题是我要约束什么?说“xyz”并不能回答这个问题。[所以在我准备好之前保存了我的答复,对不起。]选项2似乎更糟糕:必须维护存储在状态图或其他地方的我的所有模型和视图的单独数组,这似乎不太符合MVC。我从未见过有人在Ember或SC应用程序中这样做。如果没有,你只需要抓取视图。您不需要数组。至少在SC中,您可以在定义列表的页面上有一个出口,并从那里获取视图。我认为没有一个完全干净的解决方案。如果你把它放在模型上,你就破坏了MVC。如果你不这样做,你就得多做点工作。