2014-09-05 61 views
0

所以我有一个要求,应该有一个面板显示用户未提交的小部件。因为它必须在每一个观点,我提出到接受有约束力的,以未提交小部件的计数的分量:Ember绑定控制器属性在另一个控制器中查询

# components/unsubmitted-widgets.emblem 
.well.text-center 
    a href="#" My Widgets (#{unsubmittedWidgetsCount}) 
    button.small-button type="button" click="submitWidgets" 
     strong Submit Widgets 

我在想,对于小部件API查询将进入应用控制器,它所有其他控制器可以绑定到

App.ApplicationController = Ember.Controller.extend 
    unsubmittedWidgets: (-> 
    @store.find('unsubmittedWidget', user: @get('currentUser')) 
).property() 

App.HomeController = Ember.Controller.extend 
    needs: ["application"] 
    unsubmittedWidgetCount: (-> 
    @get('controllers.application.unsubmittedWidgets').toArray().length 
).property('controllers.application.unsubmittedWidgets') 

因此,这引发了请求,我得到了一个结果。但是该视图不会自动更新。该视图显示了我在任何屏幕上的我的Widgets(),当我转换到另一个视图存在的路线时,我获得了真实的值,但是当我回到原始页面时,它仍然不显示所有内容。

我该如何将页面上的值正确地绑定到返回的记录集的长度?

+2

我想你应该在你的财产上使用['@ each'](http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/)。 – MilkyWayJoe 2014-09-05 19:45:11

+0

就是这样。回答它,我会upvote和接受! – DVG 2014-09-08 17:51:08

回答

2

当你创建一个具有集合作为依赖的属性,你必须使用@each,就像这样:

App.HeroesController = Ember.Controller.extend({ 
    identities: [ 
    Em.Object.create({ mask: 'Captain America', name: 'Steve Rogers', isAvenger: true }), 
    Em.Object.create({ mask: 'Iron Man', name: 'Tony Stark', isAvenger: true }), 
    Em.Object.create({ mask: 'Batman', name: 'Bruce Wayne', isAvenger: false }), 
    ], 
    justiceLeague: function() { 
    var identities = this.get('identities'); 
    return identities.filterBy('isAvenger', false).get('length'); 
    }.property('[email protected]'), 
    avengers: function() { 
    var identities = this.get('identities'); 
    return identities.filterBy('isAvenger', true).get('length'); 
    }.property('[email protected]') 
}); 

@each将运行计算资源代码才能获得匹配项的个数,只要一个或identities数组中的更多对象获取isAvenger属性更新。对于这个例子,它应该显示两个字符的计数,考虑三个项目中有一个将过滤的属性设置为false。另一个列表观察完全相同的路径,但“公式”不同,输出上面示例的1个字符的计数。

相关问题