6

我试图了解如何在我的控制器/路由之间共享数据。

我有一个显示公司数据的应用程序。这是我想要的路线:

 /                summary info
 /companies       list of all companies with some more detail
 /companies/:id   details about a single company

现在,所有三个路线所需的数据都包含在单个公司数据数组中。所以,我希望在应用程序启动时加载这些数据,然后用于每条路线。我还需要在控制器上需要共享的其他方法。

很明显,第二条和第三条路线是嵌套的,因此我可以CompaniesController通过传入该公司的数据来共享链接到特定公司时的数据:

{{#linkTo 'company' company}}{{ company.name }}{{/linkTo}}

但总结路线是我卡住的地方。我想出的两个选项:

  1. CompaniesController使用我需要的任何其他方法创建,并通过IndexController扩展它来创建

    App.IndexController = App.CompaniesController.extend({});
    

    然后,据我所知,两条路线都需要找到模型:

    App.Router.map(function() {
        this.resource('companies');
    });
    
    App.CompaniesRoute = Ember.Route.extend({
        model: function() {
            return App.Company.find();
        }
    });
    
    App.IndexRoute = Ember.Route.extend({
        model: function() {
            return App.Company.find();
        }
    });
    

    似乎应该有更好的方法,因为我必须为我添加的每条新路线重复此操作(例如/revenue)。

  2. summary将路由嵌套在companies资源中,并为其指定路径“/”。我不喜欢的是我的 UI 的“嵌套”与数据不匹配。似乎我还必须model为每条路线重新定义属性。

还有其他更好的选择吗?

tl;dr:我应该如何跨控制器共享数据?

4

1 回答 1

3

要共享数据 beetwen 控制器,正确的方法是使用needsAPI

假设您CompaniesController拥有所有想要提供给其他控制器的数据,您应该通过 定义它needs,这可以是一个简单的字符串,或者如果您定义多个字符串,则可以是一个字符串数组。

App.MyController = Ember.ObjectController.extend({
  needs: ['companies'],
  myFunction: function() {
    // now you can access your companies controller like this
    this.get('controllers.companies');
  }
});

为了使事情更容易访问,您可以另外定义一个绑定,例如:

App.MyController = Ember.ObjectController.extend({
  needs: ['companies'],
  companiesBinding: 'controllers.companies',
  myFunction: function() {
    // now you can access your companies controller like this
    this.get('companies');
  }
});

希望能帮助到你。

于 2013-07-19T14:36:36.540 回答