我正在试图弄清楚如何构建一个包含列表的小应用程序,您可以在其中选择多个项目并切换以选择所有/无,并查看当前所选行的数量。
我认为“选定”状态不应该是模型对象的一部分,但我无法弄清楚如何做到这一点。
这是我目前的设置(显然不起作用)
可运行代码http://jsfiddle.net/jacobk/rU35G/1/
var App = Ember.Application.create();
App.ApplicationRoute = Ember.Route.extend({
model: function() { return Ember.A(["Foo", "Bar", "Baz"]); }
});
App.ApplicationController = Ember.ArrayController.extend({
allSelected: false,
selectedCount: function() {
return 0;
}.property()
});
App.RowController = Ember.ObjectController.extend({
isSelected: false
});
<script type="text/x-handlebars" data-template-name="application">
<h3>{{ selectedCount }} rows selected.</h3>
<label>
{{view Ember.Checkbox checkedBinding="allSelected"}}
Toggle select all
</label>
<hr/>
<ul>
{{#each controller itemController="row"}}
<li {{bindAttr class="isSelected"}}>
{{view Ember.Checkbox checkedBinding="isSelected"}} {{this.content}}
</li>
{{/each}}
</ul>
</script>
我正在尝试了解何时使用绑定,观察者,属性,“需求”等,以及何时适合使用控制器与视图等。我还没有弄清楚ember应用程序中的一般信息/数据流。
e.g。如果上面的示例中的ArrayController迭代“包含”视图/控制器,并且当“全部选中”复选框被切换为 OR 时,如果所有“子控制器”都观察/则更改“已选择”状态“绑定到”ArrayController并在更改时自行更改,如果是,我应该如何以相反的方向传播数据。 ArrayController如何获得“当前所有选定的”行?
我很想看到这个“规范解决方案”。
答案 0 :(得分:1)
无需行控制器。 @each,computed属性和checkedbinding可以用来解决这个问题,如下所示。必须在arraycontroller的内容中定义isSelected:
App.ApplicationController = Ember.ArrayController.extend({
allSelected: function(key, value) {
if ( value !== undefined ) {
// when check box is ticked, this gets executed
this.setEach( 'isSelected', value );
return value;
} else {
//as a computed property
return !!this.get( 'length' ) &&
this.everyProperty( 'isSelected', true );
}
}.property('@each.isSelected')
selectedCount: function() {
return 0;
}.property()
});
答案 1 :(得分:0)
我同意将选定的状态保留在模型之外。您需要在Ember.ArrayController中定义itemController
。
这是一个工作示例。 http://jsbin.com/sunat/3/edit
App.RowController = Ember.ObjectController.extend({
isSelected: false
});
App.IndexController = Ember.ArrayController.extend({
itemController: 'row',
selectAll: function(key, value) {
if (arguments.length == 2) {
this.setEach('isSelected', value);
return value;
} else {
return this.isEvery('isSelected', true);
}
}.property('@each.isSelected')
});
#template
<script type="text/x-handlebars" id="index" >
<label>
{{input type="checkbox" checked=selectAll}}
Toggle select all
</label>
<hr/>
<ul>
{{#each}}
<li>
{{input type="checkbox" checked=isSelected}} {{name}}
</li>
{{/each}}
</ul>
</script>