命名空间,共享模型,重用Ember中的控制器

时间:2015-06-21 17:33:06

标签: ember.js

我有一个Ember 1.10应用程序,支持2个模型,学生和家长的api支持,以及每个模型的基本CRUD设置,以及在访问各自/ show时向学生和家长读取和写入消息的能力页面。

我必须创建一个收件箱,其中的消息以及学生和家长上的所有其他数据都可用,并且必须这样做而无法更改或添加到api(即我可以创建一个消息端点)。

基本上,我需要保持Student和Parent模型和控制器不变,但是需要能够从收件箱下的命名空间中访问它们,如下所示:

Students
  -inbox
  -index
  -edit
  -show
Parents
  -inbox
Inbox
  StudentInbox  <-- should use StudentsRoute and StudentsController
    -index
    -show
    -edit
  ParentInbox
    -index
    -show
    -edit

因此,visit / inbox / students / 123将使用StudentRoute中定义的模型以及StudentController上定义的操作和属性。 InboxStudentsShowRoute应该同样可以访问StudentsShowRoute和Controller。

有没有一种方法可以将从Inbox命名空间下的模板触发的操作代理到相关的模型和控制器,并保持传递params的能力,而不是从Student和Parent路由和控制器复制和粘贴现有代码。

例如,在InboxStudentsShow路线上传递?unread=true之类的参数会将这些传递给StudentsShowRoute和Controller(并适当地冒泡到它的父路线和控制器)或从学生编辑学生/ inbox / 123 / edit模板可以像在student / 123 / edit模板上一样工作吗?

Ember的新手,并且知道必须有更好的方法来重用命名空间中的现有代码和代理操作。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

我来这里创建一个Mixin,其中包含相同的Route代码,并在controllerName中指定templateNameInboxStudentsShowRoute。然后,您从两个路径中的Mixin延伸。模型,模板,动作,属性都是一样的。

  

例如,传入params,例如?unread = true   InboxStudentsShow路由会将这些传递给StudentsShowRoute和   控制器(和适当的气泡到它的父路线和   控制器)

我不确定pass these to the StudentsShowRoute and Controller在这里你的意思是什么,但是在一条路线中改变的CONTROLLER属性应该在另一条路线中保持不变,因为控制器是Ember中的单例。我不知道将查询参数传递到另一条路线是什么意思,因为如果您转换到应用的其他部分,则更改网址,而您无法同时拥有2个网址,那么怎么可能呢?查询参数是否被传递到另一条路线?

在Ember 1.10中,查询参数在控制器中定义,所以我猜行为将保持不变。

InboxStudentsShowRoute示例(将代码从StudentsShowRoute移至StudentsShowMixin,定义控制器和模板名称):

import Ember from 'ember';
import StudentsShowMixin from '../mixins/students-show';

export default Ember.Route.extend(StudentsShowMixin, {
  controllerName: 'students/show',
  templateName: 'students/show'
});