2013-07-29 4 views
1

Я пытаюсь повторно использовать код в моих контроллерах/шаблонах. В одном из моих шаблонов у меня есть следующее:Как получить доступ к контенту контроллера на основе имени свойства

{{#if controllers.nodesIndex.content.isUpdating}} 

Это прекрасно работает, но делает этот шаблон очень конкретным. Я хочу обобщить это. Я хотел бы сделать Somthing как:

{{#if controllers.{{indexController}}.content.isUpdating }} 

Где indexController фактически параметр конфигурации в моем контроллере:

indexController : 'nodesIndex', 

Синтаксис не работает, и я не знаю, если есть способ делать то, что я пытаюсь сделать.

Другая вещь, которую я попытался просто:

{{#if isUpdating}} 

И я определил это как вычисляемого свойства в контроллере. Это общая настройка («базовый класс»):

getIndexController : function() { 
    return this.get('controllers.' + this.indexController); 
}, 
isUpdating  : function() { return this.getIndexController().get('content').isUpdating; }.property(), 

Но я не могу сказать property(), какие другие свойства этого вычисленное свойство зависит, так как они на самом деле конфигурируемые, возвращенная функцией getIndexController().

Любые идеи о доступе к контенту «динамического» контроллера?

ответ

1

Наличие объекта на вашем контроллере, который является именем «динамического» контроллера, является хорошим местом для запуска. Почему бы просто не повлиять на вашу собственность?

getIndexController : function() { 
    return this.get('controllers.' + this.indexController); 
}, 
isUpdating : function() { 
    return this.getIndexController().get('content').isUpdating; 
}.property('indexController'), 

Если вы считаете «getIndexController» вспомогательной функцией, тогда это имеет смысл. Подвижные две функции вместе делает его легче увидеть, что атрибут IndexController является единственным реальным свойством, которое нужно соблюдать:

isUpdating : function() { 
    return this.get('controllers.' + this.indexController).get('content').isUpdating; 
}.property('indexController'), 
+0

Не уверен, что это может работать вообще: 'isUpdating' не зависит от значения' this.indexController', но на 'isUpdating' свойство 'content'' контроллера ', указанное в 'this.indexController'. То есть, даже если 'this.indexController' не изменяется (что не будет: это фиксированный параметр для данного контроллера), свойство' isUpdating' может очень хорошо измениться, поскольку указанное свойство в контроллере, указанное в 'this.indexController' изменится. – dangonfast

2

Я думаю, что вы собираетесь неправильно. Ember предоставляет несколько вариантов обмена шаблонами между контроллерами.

Здесь я сделал пример с частичной http://jsfiddle.net/marciojunior/KxM9k/

<script type="text/x-handlebars" data-template-name="application"> 
    <h1>Partial example</h1> 
    {{#linkTo "index"}}Index{{/linkTo}} 
    {{#linkTo "other"}}Other{{/linkTo}} 
    {{outlet}} 
</script> 

<script type="text/x-handlebars" data-template-name="index"> 
    <h2>Index template</h2> 
    {{partial "updatingMessage"}} 
</script> 

<script type="text/x-handlebars" data-template-name="other"> 
    <h2>Other template</h2> 
    {{partial "updatingMessage"}} 
</script> 

Все варианты имеющиеся находятся в этой ссылке http://emberjs.com/guides/templates/rendering-with-helpers/

+0

Я уже использую частичные/выходные. Тем не менее, мои шаблоны верхнего уровня могут быть объединены в один шаблон. Вот почему я хочу удалить любые специфические для контроллера ссылки и сделать это настраиваемым в контроллере.Представьте себе, что вы хотите объединить свой «индекс» и ваш «другой» шаблон в «общий» шаблон. Поскольку я использую отдельные файлы для своих шаблонов, я надеюсь, что смогу использовать символические ссылки для ссылки на общий шаблон - или, возможно, использовать другой трюк. – dangonfast

0

Я реализовал это косвенным образом, с наблюдателем:

isUpdatingChanged: function() { 
    this.getTopController().set('isUpdating', this.get('content').get('isUpdating')); 
}.observes('content.isUpdating'), 
Смежные вопросы