我在Ember数据中有2个模型:Tag
拥有并属于许多Files
,两个模型都是通过Rails后端的JSON加载的。由于关系的多对多性质,我的网址没有深层嵌套。以下是在Ember中设置的代码:
App.Router.map ->
@resource 'tags', ->
@resource 'tag',
path: 'tags/:tag_id'
, ->
@resource 'file',
path: 'files/:file_id'
, ->
App.Tag = DS.Model.extend
name: DS.attr('string')
files: DS.hasMany('file',
async: true
)
App.File = DS.Model.extend
name: DS.attr('string')
tags: DS.hasMany('tag',
async: true
)
在tags
页面中,我会显示所有标签的列表 - 此处没有问题。在tags/:tag_id
页面中,我显示了具有该标记的文件列表 - 也没有问题。在files/:file_id
页面中,我想显示有关该文件的一些信息,并能够执行诸如编辑属于该文件的标记之类的操作。这样做需要我在Ember中加载属于和不属于该文件的所有标签的列表,但由于路由不在同一层级链中,我不能做例如
App.FileController = Ember.ObjectController.extend
needs: 'tags'
tags: Ember.computed.alias('controllers.tags.content') # undefined
获取我需要的数据,尽管如果可能的话,这正是我需要的。在该路由中传递所有标记(尤其是不属于该文件的标记)的所有JSON也没有意义。
此时我有哪些选择?我猜测我必须重新构建代码,以便在tags
中访问ApplicationController
信息并调用needs: 'application'
。我还没有想出如何在ApplicationController
中加载正确的JSON。我缺少一种替代/更好的方法吗?
答案 0 :(得分:0)
我会在FileRoute中设置标签控制器的内容。
App.FileRoute = Ember.Route.extend(
init: ()->
@_super()
@generateController('tags')
setupController : (controller, model) ->
@_super(controller, model)
@controllerFor('tags').set('model', @get('store').find('tag'))
)
这样,您可以保留所有其他代码,但我认为您应该使用Ember.computed.alias(' controllers.tags.model')而不是Ember.computed.alias(' controllers.tags.content'。)