Ember'需要'不相关控制器之间的依赖关系

时间:2014-11-12 01:44:35

标签: ember.js ember-data

我在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。我缺少一种替代/更好的方法吗?

1 个答案:

答案 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'。)