javascript - 在 Ember.js 中渲染应用程序之前等待模型加载

标签 javascript ember.js ember-data

我有许多不同的应用程序级模型——即当前用户、当前帐户等——我想在呈现我的应用程序之前加载它们。这应该如何以及在哪里完成? This question/answer帮助很大,但它没有涵盖异步方面。

下面的代码完成了我想要的,但是在 beforeModel 中加载模型(利用它等待 promise 解决)似乎不正确。我是否应该在 ApplicationRoute 中加载这些模型?

App.ApplicationController = Ember.Controller.extend({
  currentAccount: null
});

App.ApplicationRoute = Ember.Route.extend({
  beforeModel: function () {
    var self = this;

    return App.Account.find(...).then(function (account) {
      self.controllerFor('application').set('currentAccount', account);
    });
  }
});

感谢您的帮助!

最佳答案

诀窍是从路由的模型方法返回一个 promise 。
这将导致路由器转换到 App.LoadingRoute 路由,直到 promise 解决(可用于加载指示条/轮子等)
当 promise resolve 时,App.LoadingRoute 将被停用,原始路由的 setupController 方法将被调用。
这适用于 ember-data promises、JQuery 的 $.ajax promises 和 ember-model 的 fetch promises。
只需确保在解决 promise 后返回实际模型即可。
如果 promise 被拒绝,这也是处理错误的好地方 - 但我会把它留给其他问题。

至于你应该在哪里加载你的模型 - 这取决于你的应用程序的使用。
通常您会加载一个模型,其中 URL 指示您需要该模型 - 经验法则是 URL 中模型 ID 的指示。
如果您需要预取一些数据,这当然会改变。

现在是一些代码:

App.SomeRoute = Ember.Route.extend({
   model: function(params){
       return App.SomeModel.fetch(params.model_id).then(function(modelData){
           // it is better to return the actual model here, and not the promise itself
           return App.SomeModel.find(params.model_id);
       });

   },
   setupController: function(controller, model){
       controller.set("model", model);
       // do some controller setup here - can be omitted if no setup is needed
       // this will run only after the promise has been resolved.
   }
});

App.LoadingRoute = Ember.Route.extend({
        activate: function(){
            this._super();
            // add some loading indication here
        },
        deactivate: function(){
            this._super();
            // remove loading indication
        }
}

希望这对您有所帮助。

关于javascript - 在 Ember.js 中渲染应用程序之前等待模型加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105099/

相关文章:

php - 是否可以使用 php 和 javascript 访问同一个 sqlite 数据库?

node.js - 如何将项目迁移到yarn Flat模式?

javascript - Ember JS : Customizing adapter to include multiple parameters

javascript - 如何在 ember.js 中创建一个寄存器?存储.createRecord

javascript - 有人可以提供一张图表,说明 ember 数据如何与浏览器的持久层相关吗?

Javascript 替换在控制台中工作,而不是在代码中工作

javascript - 将图像数组绘制到 Canvas 上

JavaScript 类型错误 : Cannot read property 'style' of null

javascript - Ember : prevent link-to from firing when an action within it is clicked

namespaces - Ember.js 模型中的保留属性名称