ember中的数据共享

时间:2013-07-19 13:53:30

标签: ember.js

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

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

 /                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属性。

  3. 还有其他选择更好吗?

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

1 个答案:

答案 0 :(得分:3)

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

假设您的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');
  }
});

希望它有所帮助。