2

作为我另一个问题的后续(我认为这个问题更具体),我想问你如何在应用程序启动时加载数据。我需要一些缓存策略。

我们内部应用程序中显示的数据每周刷新一次,因此我不想在每次用户输入路线时都发出新请求(现在我看到很多 ajax 请求在应用程序中移动)。

.all() 方法可能会解决我的问题,但首先我必须加载数据。

我还能在哪里加载控制器和模板可以访问的数据?model是否可以像使用andcontrollerFor钩子一样在应用程序启动时加载数据并将其传递给控制器​​?

在我看来,用户必须每周刷新一次应用程序是没有问题的——也许我们以后可以改变它。

我对直观像素答案的理解

首先从服务器加载数据:

App = Ember.Application.create({
    ready: function() {
        this.set('userCache', App.User.find());
        this.set('currentUserCache', App.User.find(1));
        this.set('topCache', App.Top.find());
    }
});

然后从缓存中加载数据(存储)

App.SomeRoute = Ember.Route.extend
  setupController: (controller, model) ->
    @controllerFor('user').set 'content', App.User.all()
    # though I can access its properties via console data is not visible in the template
    @controllerFor('currentUser').set 'content', App.User.all().objectAt(0)
    @controllerFor('top').set 'content', App.Top.all()

例如,虽然我可以通过以下方式访问头像源:

App.CurrentUser.all().objectAt(0).get('gravatar')

它在模板中不可见

{{#linkTo 'users' classNames="avatar pull-left" title="back"}}
  {{avatar gravatar}}
{{/linkTo}}

我也尝试过content.gravatarcontroler.gravatar没有成功。 其余部分在视图中可见

4

1 回答 1

2

只有在概念上你才能做这样的事情:

App = Ember.Application.create({
  // Load your data once and set it somewhere accessible
  ready: function() {
    this.set('superModelCache', App.SuperModel.find());
  }
});


// Define your special model
App.SuperModel = DS.Model.extend({
  prop1: DS.attr('string'),
  prop2: DS.attr('string'),
  ...
});

// And then in all the routes that need data from your cache
// you could do something like this
App.MyFirstRoute = Ember.Route.extend({
  model: function () {
    return App.get('superModelCache.prop1');
  }
});

// and so on...
App.MySecondRoute = Ember.Route.extend({
  model: function () {
    return App.get('superModelCache.prop2');
  }
});

或者你可以在你的路线中也做这样的事情:

// And then in all the routes that need data from your cache
// you could do something like this
App.MyFirstRoute = Ember.Route.extend({
  model: function () {
    return App.SuperModel.all().get('prop1');
  }
});

// and so on...
App.MySecondRoute = Ember.Route.extend({
  model: function () {
    return App.SuperModel.all().get('prop2');
  }
});

这只会在应用程序启动时发出 GET 请求,然后您可以在应用程序生命周期内通过一些间隔/轮询重新加载数据。

如果您的应用程序完全依赖数据来启动,您也可以在完成App.deferReadiness();后调用他的对应方App.advanceReadiness();,请参阅此处的 API 文档以供参考:http ://emberjs.com/api/classes/Ember.Application.html# method_deferReadiness

希望能帮助到你

于 2013-05-15T08:44:39.093 回答