2014-09-05 2 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') 

Таким образом, это устраняет запрос, и я получаю результат. Однако представление не обновляется автоматически. В представлении отображаются My Widgets() на любом экране, на котором я включен, и когда я перехожу на другой маршрут, где присутствует представление, я получаю реальное значение, но когда я возвращаюсь к исходной странице, он все еще не отображает все.

Как я мог бы фактически связать значение на странице с длиной возвращаемого набора записей?

+2

Я думаю, что вы должны использовать ['@ each'] (http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/) в своей собственности. – MilkyWayJoe

+0

Вот и все. Отвечайте, и я поддержу и приму! – DVG

ответ

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 символа для приведенного выше примера.