2015-09-28 5 views
2

Беря следующий пример:Как передать вычисленное свойство от маршрута к компоненту

<script type="text/x-handlebars"> 
    <h2>Welcome to Ember.js</h2> 

    {{outlet}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{#each model as |item|}} 
     <li>{{item}}</li> 
    {{/each}} 
    {{magnus-component name=firstName}} 
    </ul> 
    </script> 

    <script type="text/x-handlebars" data-template-name="components/magnus-component"> 
    <!-- Doesn't appear --> 
    {{name}} 
    </script> 

... и

App = Ember.Application.create(); 

App.Router.map(function() { 
}); 
App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return ['red', 'yellow', 'blue']; 
    }, 
    name: "Magnus", 
    surname: "Womble", 
    fullName: Ember.computed('name', 'surname', function(){ 
    return this.get('name') + ' '+this.get('surname'); 
    }) 
}); 

Что можно найти в следующем jsbin:

http://emberjs.jsbin.com/higako/edit?html,js,output

Как правильно передать свойство fullName компоненту templ ел?

+0

бит поздно к партии, но так как FULLNAME относится к атрибутам Вашей модели, может быть стоит иметь вычисленное свойство на модели вместо этого? –

ответ

6

Вы должны переместить логику из IndexRoute в IndexController:

App.IndexController = Ember.Controller.extend({ 
    name: "Magnus", 
    surname: "Womble", 
    fullName: Ember.computed('name', 'surname', function(){ 
    return this.get('name') + ' '+this.get('surname'); 
    }) 
}); 

И затем, если вы используете:

{{magnus-component name=fullName}} 

вместо (firstName нигде не определено):

{{magnus-component name=firstName}} 

Будет работать.

Working demo.

+0

Спасибо за это, гм ... демо не работает! Но тем не менее я понимаю вашу логику. Тем не менее, большая проблема заключается в том, что Ember планируют отказаться от контроллеров, что заставляет меня задаваться вопросом, как это сделать в будущем. –

+0

Это работает для меня - http://i.imgur.com/kkbCRXP.png. О будущем, ну, вы должны оставить логику в Route и передать 'fullName' в свойстве модели. Таким образом, вы можете передать 'model.fullName' вместо' fullName' для маршрутизации или компонента. Все данные должны быть получены в Route, а затем переданы в свойство модели вашему контроллеру/компоненту. Тогда у вас не будет проблем при замене компонентов контроллерами. –

+0

Ссылка у вас там отличная от той, что в вашем комментарии. Это объясняет, почему это не сработало. Дело в том, что мой фактический прецедент немного сложнее. Я хочу передать результаты функции, которая связана с вызовом store # getAll для компонента. Очевидно, что я обычно не делал этого с модели. Я приношу свои извинения за менее адекватный вопрос в этом отношении. –

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