2013-02-20 108 views
4

比方說,我有一個應用程序有兩個路徑:「/服務」和「/服務/:服務」。動態創建網點

當用戶訪問:服務狀態時,我希望他看到與某個特定服務有關的信息列表。到目前爲止,微不足道。但是,當同一用戶訪問/服務時,我想顯示服務列表加上每個服務信息(對於每個服務)。我也想在沒有任何模板重複的情況下做到這一點。

顯而易見的答案似乎是出路,但它看起來像所有網點必須靜態命名,我有一個以前未確定的數量。它們都有獨特的名稱,但我當然無法在模板中對其名稱進行硬編碼。我想動態地確定插座名稱,所以我可以在renderTemplate中適當地調用this.render來填充它們,但我不知道該怎麼做。

你會建議什麼?

更新:看起來我可以使用{{template}}處理我的特定情況,但不會連接另一條路由,如此。我仍然想知道如何去做;之後我會做更復雜的事情,那樣肯定會更好,並且在各自的控制器中仍然有重複的代碼。

更新:我終於下定了自己的「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 2013-02-20 16:22:07

+0

我無法讓jsfiddle工作。雖然不工作,但http://jsfiddle.net/qU44U/可能會給你這個想法。 – Baughn 2013-02-20 17:06:46

回答

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> 

助手能夠使用的機型性能出口名稱。