2016-09-26 55 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', 
});