2013-09-21 3 views
9

Я обновляю следующий маршрут:действия Доступ из внутри маршрута в ember.js

App.SomeRoute = Ember.Route.extend({ 
events: { 
    getMore: function(){ 
    var controller = this.get('controller'), 
     nextPage = controller.get('page') + 1, 
     perPage = controller.get('perPage'), 
     items; 

    items = this.events.fetchPage(nextPage, perPage); 
    controller.gotMore(items, nextPage); 
    }, 

    fetchPage: function(page, perPage){ 
    . . . . 
    } 
} 
}); 

По большей части, это работает отлично. Однако синтаксис events устарел. Вместо этого мы должны использовать actions. Обновление, которое работает достаточно хорошо, пока я не добраться до линии:

items = this.events.fetchPage(nextPage, perPage); 

Это бросает ошибку:

TypeError: this.events is null 

К сожалению, я получаю ту же ошибку, если я обновляю код:

items = this.actions.fetchPage(nextPage, perPage); 
=> TypeError: this.actions is null 

Как я могу получить доступ к методам действий из одного и того же маршрута?

ответ

14

Вы должны использовать Пошлите() для вызова функции внутри хэш действия. Пример:

App.SomeRoute = Ember.Route.extend({ 
    actions: { 
     getMore: function(){ 
     var controller = this.get('controller'), 
      nextPage = controller.get('page') + 1, 
      perPage = controller.get('perPage'), 
      items; 

     items = this.send('fetchPage', nextPage, perPage); 
     controller.gotMore(items, nextPage); 
     }, 

     fetchPage: function(page, perPage){ 
     .. . . 
    } 
    } 
}); 
+0

Это делает. Спасибо! – nullnullnull

+1

FWIW, если вы хотите заглушить действие в одном из своих тестов (например, с помощью Sinon), вы можете получить доступ к действию с помощью символа подчеркивания: sinon.spy (route._actions, 'getMore') Do not сделайте это в своем обычном коде. –

4

Вы можете использовать метод send(actionName, args...) для выполнения некоторых действий.

В вашем случае:

this.send('fetchPage', nextPage, perPage); 
6

Стоит также отметить, что вы могли бы потенциально переместить fetchPage из actions хэша. Если он используется только «внутренне» и не отвечает непосредственно на события пользовательского интерфейса, то он не должен находиться в хеше actions. Тогда вы можете просто называть это:

items = this.fetchPage(nextPage, perPage); 
+0

Спасибо, это работает. – nullnullnull

Смежные вопросы