2013-07-17 2 views
2

Это довольно простой, но по какой-то причине я не могу заставить его работать.Как мне получить доступ к модели в контроллере?

Я создал ресурс фирмы:

App.Router.map(function() { 
    this.resource('companies'); 
}); 

и конкретизирована модель

App.Company = DS.Model.extend({ 
    name: DS.attr('string'), 
}); 

App.CompaniesRoute = Ember.Route.extend({ 
    model: function() { 
     return App.Company.find(); 
    } 
}); 

У меня есть некоторые Светильники для тестовых данных.

Теперь, не должен ли я иметь доступ к моим данным companies с контроллера? Как это

App.CompaniesController = Ember.ArrayController.extend({ 
    length: function() { 
     return this.get('length'); 
    }.property(), 
}); 

Я получаю 0, и все, что я пытался в этой функции заставляет меня думать, что как-то контроллер не получает загружены данные - даже если я могу перебрать модели в мой шаблон, как это:

<script type="text/x-handlebars" data-template-name="companies"> 
    <div class="row"> 
     <div class="span12"> 
     <h3>Companies</h3> 
     {{#each controller}} 
      <li>{{ name }}</li> 
     {{/each}} 
     </ul> 
     </div> 
    </div> 
    </script> 

Некоторые части документации показывают setupController вместо model: function() {}, но я не ясно, о различиях. Я пробовал оба, без успеха.

Любые идеи?

ответ

3

Ваш должен объявить путь к свойствам (или свойствам), зависит от Computed Property. В этом случае, content.length:

App.CompaniesController = Ember.ArrayController.extend({ 
    length: function() { 
     return this.get('content.length'); 
    }.property('content.length'), 
}); 

или использовать Binding:

App.CompaniesController = Ember.ArrayController.extend({ 
    lengthBinding: 'content.length' 
}); 

Но вычисляемые свойства требуют меньше работы, чем переплеты (внутренне), и в целом быстрее.

1

Вы объявляете свою «длину» как свойство, не наблюдая за изменениями содержимого контроллера, поэтому, когда экземпляр контроллера создан, он равен 0, поэтому он никогда не обновляется, вы можете либо делайте то, что говорит Панайотис, либо вы также можете наблюдать за свойством «@each» этого контента:

App.CompaniesController = Ember.ArrayController.extend({ 
    length: function() { 
    return this.get('length'); 
    }.property('@each') 
}); 
+0

nice. в чем разница между «@each» и «@ each.name»? Первый будет пересчитывать, когда какое-либо свойство изменяется, второе - только при изменении свойства имени? –

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