安贝& # 39;需要# 39;属性不能工作,除非你先访问所需的控制器路由

Ember 'needs' property doesn't work unless you visit the needed controllers route first

本文关键字:访问 控制器 路由 工作 需要 属性 不能 安贝 除非你      更新时间:2023-09-26

我遇到了一些问题,要么是烬的'需要'控制器属性的问题,要么是我不明白实现我的目标的正确方法。

目标是能够从另一个控制器访问一个或多个控制器的内容。

例如,我有一个路由All Accounts,它需要访问Bank Accounts和Credit Accounts的内容,以便它可以显示所有帐户:)

问题是那些控制器的内容总是空的,除非您先访问银行和信用帐户路由!

下面是一个说明问题的jsbin:

http://jsbin.com/yubul/1/edit?html、js、输出

只有当你访问需要它的路由时,控制器才会自动填充它的模型。控制器可以没有模型而存在。needs通常应该只发生在上游,而不是兄弟资源/路由。

如果一个资源依赖于另一个资源,那么它应该是嵌套结构的一部分,或者同时获取。

this.resource('accounts', function(){
  this.resource('bank-accounts');
  .....
});

一般情况下,在用例中,你不一定需要一个嵌套的路由,但你确实需要多个资源,我从单个路由返回多个资源,或在setupController钩子中设置多个控制器。

具有多个模型(属性)的模型

App.FooRoute = Em.Route.extend({
  model: function(){
    return Em.RSVP.hash({
       cars: this.store.find('car'),
       dogs: this.store.find('dog')
    });
  }
});

使用上述技术,您的控制器将是一个具有两个属性的ObjectController, carsdogs,每个属性都将是一个集合。

setupController设置多个模型

App.FooRoute = Em.Route.extend({
  model: function(){
    return this.store.find('car');
  },
  setupController: function(controller, model){
    // this._super does the default implementation of setupController
    this._super(controller, model);
    this.controllerFor('dogs').set('model', this.store.find('dog'));
  }
});

或者你可以做一些介于两者之间的事情,混合和匹配。