Ember控制器仅在请求时从其模型中获取数据。怎么样?

时间:2012-02-09 16:31:16

标签: javascript ember.js

使用ember-data,目前我在页面加载时将数据加载到控制器中,如下所示:

App.articlesController = Ember.ArrayController.create({
    content: App.store.findAll(App.Article)
});

拥有大量控制器,这会导致很多请求。我希望只有在请求控制器时才能从服务器获取数据。你能说一下,做到这一点的“正确”方法是什么?

3 个答案:

答案 0 :(得分:3)

扎克,

您是否看过didInsertElementwillInsertElement?当视图确实被放入DOM或将被分别放入DOM时,它们将被调用。我认为你不需要在这里使用init,除非必须这样做,否则你不应该这样做。

另一个注意事项:视图中对控制器的硬编码引用也不是最好的。你的把手模板中应该有一个绑定。例如,如果你的把手模板有这个:

{{#view App.ArticlesView controllerBinding="App.articlesController"}}

您的观点可能类似于:

App.ArticlesView = Ember.View.extend({
  templateName: 'app_templates_layouts_articles',

  willInsertElement: function() {
    var controller = this.get('controller');

    if (controller && controller.get && controller.get('content') == null) {
      controller.refresh();
    }
  } 
});

如果您需要重复使用该视图,则可以轻松实现。

答案 1 :(得分:1)

您最初可以将内容设置为空数组并使用可以根据需要调用的加载方法:

App.articlesController = Ember.ArrayProxy.create({
    content: []

    load: function() {
        this.set("content", App.store.findAll(App.Article));
    }
});

答案 2 :(得分:1)

刚刚发现,如果将方法定义为init,则会在创建对象时调用它。

所以我在相关视图中定义了一个init函数,用于检查数据是否被提取:

App.ArticlesView = Ember.View.extend({
  templateName: 'app_templates_layouts_articles',

  init: function() {
    this._super();

    if ( App.articlesController.get("content") == null){
      App.articlesController.refresh();
    }
  } 
});