2016-09-26 100 views
0

我必須爲12條不同路線複製相同的行爲(嵌套路線,模型,控制器功能,存儲功能)。唯一的區別是它們的模型屬性中的模板也將被更新。 因此,例如我有兩條路徑命名爲Notes和Tasks,它們以相同的方式獲取,並且在控制器中也具有相同的功能,但Tasks路徑的屬性表示主題和文本,而Notes具有名稱和描述,但即使模板功能是一樣。Ember js:製作動態路線和模型和控制器

什麼是最好的方法不重複相同的功能這樣的路線?一個模型或路線或控制器是否可以被創建爲足夠通用的,這樣ember.js可以決定運行時間爲每條單獨的路線做些什麼?我可以爲我擁有的12條不同路線重複使用一個模型/控制器/路線的功能嗎?

回答

2

注意:Ediomatic Ember 2.x支持在控制器上使用組件,但是我已經使用控制器回答問題,因爲問題指定了控制器。

您可以通過定義包含常用功能的基本路由並使用由子類定義的屬性來定製行爲,從而利用繼承。

// routes/base.js 
import Ember from 'ember'; 

export default Ember.Route.extend({ 
    // shared route definition 
    modelName: null, 
    attributes: [], 
}); 

// routes/note.js 
import BaseRoute from 'base'; 

export default BaseRoute.extend({ 
    modelName: 'note', 
    attributes: ['name', 'description'], 
}); 

// routes/task.js 
import BaseRoute from 'base'; 

export default BaseRoute.extend({ 
    modelName: 'task', 
    attributes: ['subject', 'text'], 
}); 

你可以爲控制器做同樣的事情。沒有模板繼承,但可以使用部分或覆蓋路由中的templateName屬性。

局部模板:

<!-- template/base.hbs --> 
<p>Template Markup for {{modelName}}</p> 

// controllers/note.js 
import BaseController from 'base'; 

export default BaseController.extend({ 
    modelName: 'note', 
}); 

<!-- template/note.hbs --> 
{{partial 'base'}} 

重寫TEMPLATENAME:

<!-- templates/base.hbs --> 
<p>Base Template Markup</p> 

// routes/note.js 
export default BaseRoute.extend({ 
    modelName: 'note', 
    attributes: ['name', 'description'], 
    templateName: 'base', 
}); 

有了繼承,這是最簡單的,如果你的屬性實際上共享屬性名稱,只在自己的顯示名稱不同(例如爲name屬性/ subjecttitle,而text/description的屬性爲text,同時保留顯示名稱名稱/主題和文本/描述各自爲1 Y)。如果情況並非如此,那麼您將需要一種方法來引用您想要在模板中引用的屬性(例如,是使用model.name還是model.subject)並且會變得非常混亂。定義起來要容易得多displayForText

<!-- template/base.hbs --> 
<p>{{displayForTitle}}: {{model.title}}</p> 
<p>{{displayForText}}: {{model.text}}</p> 

// controllers/note.js 
import BaseController from 'base'; 

export default BaseController.extend({ 
    displayForTitle: 'Name', 
    displayForText: 'Description', 
});