1

在我的应用程序中,我强制App.Nodes.find()提前(in ApplicationRoute.setupController),因为我需要访问所有路由中的节点。要获得一个节点,我有这个应用程序方法:

var App = Ember.Application.createWithMixins({
    ...
    getNode: function (nodeId) {
        var nodes = this.Node.find();
        var node = nodes.findProperty('id', nodeId);
        return node;
    },
    ...
});

但这每次都会触发一个请求。为了避免这种情况,我一直在保留rawNodes缓存:

cacheNodes : function () {
    this.set('rawNodes', this.Node.find());
},

但我不喜欢保留一个单独的缓存,而不是 ember 在商店中的缓存,因为这迫使我手动保持同步。

我想重复使用商店中的数据而不是请求新数据。如何访问nodes商店?

4

1 回答 1

1

为了实现您的目标,您有不同的选择。

例如,您可以访问商店的缓存.all()以避免触发请求,例如:

var App = Ember.Application.createWithMixins({
  ...
  getNode: function (nodeId) {
    var nodes = this.Node.all();
    var node = nodes.findProperty('id', nodeId);
    return node;
  },
  ...
});

根据您需要访问节点的位置,例如从另一个控制器,您还可以使用needsAPI 访问您的节点,如下所示:

App.FooController = Ember.ObjectController.extend({
  needs: 'nodes',
  nodesContentBinding: 'controllers.nodes.content',
  someMethod: function() {
    this.get('nodesContent');
  }
});

甚至是另一种路线蜂鸣:

App.SomeRoute = Ember.Route.extend({
  someMethod: function() {
    this.controllerFor('nodes').get('content');
  }
});

所有这些方法都不会触发任何访问应用程序中已经存在的节点的请求。

希望能帮助到你。

于 2013-08-09T06:58:53.127 回答