2013-02-20 3 views
4

Предположим, у меня есть приложение с двумя маршрутами: «/ services» и «/ services /: service».Динамически создаваемые торговые точки

Когда пользователь посещает состояние службы: я бы хотел, чтобы он просмотрел список сведений, относящихся к одной конкретной службе. До сих пор тривиально.

При одинаковых посещениях/сервисах пользователей я хотел бы показать список услуг, плюс информацию об услугах (для каждой услуги). Я также хотел бы сделать это без дублирования шаблонов.

Очевидным ответом, по-видимому, были выходы, однако похоже, что все выходы должны быть статически названы, и у меня есть заранее определенное количество из них. Все они имеют уникальные имена, но, конечно, я не могу перекодировать имена в шаблоне. Я хотел бы динамически определять имена розетки, поэтому я могу соответствующим образом вызвать this.render в renderTemplate, чтобы заполнить их, но я не знаю, как это сделать.

Что вы предложите?

UPDATE: Кажется, что я могу обрабатывать свой конкретный случай с помощью {{template}}, но это не связывает другой маршрут как таковой. Я все еще хотел бы знать, как это сделать; Позднее я буду делать более сложные вещи, где это определенно будет лучше, и в соответствующих контроллерах все еще происходит дублирование кода.

UPDATE: В конце концов я сделал свой собственный помощник «dynOutlet», как таковой:

// Define "dynamic outlets". These are just like normal outlets, 
// except they dereference the outlet name. 
Handlebars.registerHelper('dynOutlet', function(property, options) { 
    Ember.assert("Syntax: {{dynOutlet <property>}}", arguments.length === 2); 
    var context = (options.contexts && options.contexts[0]) || this, 
     normalized = Ember.Handlebars.normalizePath(
     context, property, options.data), 
     pathRoot = normalized.root, 
     path = normalized.path, 
     value = (path === 'this') ? pathRoot : Ember.Handlebars.get(
     pathRoot, path, options); 
    return Ember.Handlebars.helpers.outlet(value, options); 
}); 

Я еще, чтобы выяснить, будет ли это работать так, как я хочу, хотя.

+1

Можете ли вы сбить немного jsFiddle, пожалуйста? – Wildhoney

+0

У меня проблемы с работой jsfiddle. Возможно, http://jsfiddle.net/qU44U/ предоставит вам идею, несмотря на то, что она не работает. – Baughn

ответ

1

У меня также была необходимость определить динамические розетки. Это помощник я внедрена:

Ember.Handlebars.registerHelper('dynamicOutlet', function(property, options) { 
    var outletSource; 

    if (property && property.data && property.data.isRenderData) { 
     options = property; 
     property = 'main'; 
    } 

    outletSource = options.data.view; 
    while (!(outletSource.get('template.isTop'))){ 
     outletSource = outletSource.get('_parentView'); 
    } 

    options.data.view.set('outletSource', outletSource); 

    var firstContext = options.contexts.objectAt(0); 

    options.hash.currentViewBinding = '_view.outletSource._outlets.' + firstContext.get(property); 

    var controller = App.__container__.lookup("controller:movies"); 
    options.contexts.clear(); 
    options.contexts.addObject(controller); 
    return Ember.Handlebars.helpers.view.call(controller, Ember.Handlebars.OutletView, options); 
}); 

Это путь я использовать его в своих шаблонах:

<div> 
    {{title}} <!-- accessing title property of context --> 
    {{dynamicOutlet outletName}} <!-- accessing the property that should be used as name of the outlet --> 
</div> 

Помощник позволяет использовать свойство моделей как имена выходных.