2015-02-26 5 views
0

Я новичок в Ember, и я вытягиваю свои волосы из-за этого.Обмен данными между контроллерами в Ember

Приложение, над которым я работаю, имеет набор «предупреждений», которые будут динамически обновляться. У меня есть шаблон предупреждений/контроллер/модуль, все работают нормально. Контроллер предупреждений имеет способ отображения количества предупреждений, которые не были уволены. Это отлично работает в шаблоне предупреждений.

Однако, когда я доступ к этому же методу из другого контроллера, он всегда возвращает 0.

Here's a pastebin with the controllers, templates and model

Спасибо за любую помощь!

UPDATE:

я обнаружил, что если я на самом деле загрузить оповещение просмотра, а затем вернуться к просмотру дома, контроллер оповещения начинает возвращение правильного значения. Поэтому, по-видимому, проблема связана с тем, что данные прибора не готовы, когда контроллер меню обращается к этому методу. Я еще не смог понять, почему.

+0

Ах, это потому, что ваш AlertRoute настраивает модель. Если вы просто посетите Home, Ember не знает, чтобы загрузить модель - даже с вычисленным «оставшимся» свойством. По крайней мере, это моя догадка. Поместите некоторый console.log в крюк 'AlertsRoute.model' и посмотрите, будет ли он вызван. ...Я сомневаюсь в этом. –

+0

Я обновил свой ответ, чтобы показать, как вы можете настроить свою модель в 'AlertsController' –

+0

. Вы правы, что метод модели AlertsRoute не вызывался. Однако, добавив метод init, который вы предложили, я обнаружил, что, пока метод init вызывается до вызова остающегося метода, self.set ('model', model); не вызывается до тех пор, пока оставшийся метод уже не будет вызван, заставляя его по-прежнему возвращать 0; –

ответ

0

попробовать что-то вроде этого:

App.HomeRoute = Ember.Route.extend({ 
    renderTemplate: function(controller, model) { 
     this._super(controller, model); 
     this.render('menu', { 
      into: 'home', 
      outlet: 'alertsMenuItem', 
      controller: 'alerts' 
     }); 
    }  
}); 

<script type="text/x-handlebars" data-template-name="home"> 
    <img {{bind-attr src=appInfo.headerImage}} id="header_image" alt="Header Image" /> 
    {{render "alerts" model}} 
    <ul id="home_nav"> 
     <li>Home</li> 
     <li>About</li> 
     <li> 
      {{outlet "alertsMenuItem"}} 
     </li> 
    </ul> 
</script> 

<script type="text/x-handlebars" data-template-name="menu"> 
    {{#link-to 'alerts'}} 
     Alerts ({{remaining}}) 
    {{/link-to}} 
</script> 

с Ember.Route.render вы можете указать controller использовать для шаблона.

Обратите внимание, что если вы хотите получить доступ к своей AlertsModel с маршрутов, отличных от alerts, вы должны настроить свою модель в AlertsController. Что-то вроде этого работает для меня с Ember 1.10, но может быть немного отличается для более ранней версии:

App.AlertsController = Ember.ArrayController.extend({ 
    init: function() { 
     var self = this; 
     this.store.find('alert').then(function(model) { 
      self.set('model', model); 
     }); 
    }, 
    sortProperties: ['createdAt:desc'], 
    sortedModel: Ember.computed.sort("model", "sortProperties"), 
    remaining: function() { 
      console.log(this.filterBy('isCompleted', false).get('length')); 
      return this.filterBy('isCompleted', false).get('length'); 
    }.property('@each.isCompleted') 
}); 
+0

Это действительно дает шаблон меню для использования контроллера предупреждений. К сожалению, у меня уже был код. Я обращаюсь к «оставшемуся» методу, он просто не возвращает правильный номер. Результат с этим один и тот же, с шаблоном меню, отображающим 0 предупреждений. –