【问题标题】:What are the right hooks in Ember.js to implement a "loading" state in a route?在 Ember.js 中,在路由中实现“加载”状态的正确钩子是什么?
【发布时间】:2014-05-10 19:56:37
【问题描述】:

在加载位置模型时,我想在模板中显示加载/微调器消息。我无法做到这一点。

{{#if loading}}
  <div class="spinner"></div>
{{else}}
  <div>Here goes the position</div>
{{/if}}

给定路由器

App.Router.map(function() {
  this.resource('article', { path: '/:id' }, function() {
    this.route('position', { path: '*position_id' });
  });
});

我在ArticlePositionRoute 中的方法如下:

App.ArticlePositionRoute = Em.Route.extend({

  actions: {
    loading: function() {
      var controller = this.get('controller');
      if (controller) controller.set('loading', true);
      return false;
    }
  },

  setupController: function(controller, model) {
    controller.set('loading', false); // BEFORE _super
    this._super(controller, model);
    controller.set('loading', false); // AFTER _super
  },

  model: function(params) {
    return promiseThatTakesAWhile(); // slow fetch model
  },

  afterModel: function(model) {
    var self = this;
    return promiseThatTakesAWhile().then(function(result) {
      model.set('result', result);
      self.set('controller.loading', false); // THIS THROWS "Uncaught Error: Property set failed: object in path "controller" could not be found or was destroyed."
    });
  }

});

afterModel中,控制器不可用,抛出Uncaught Error: Property set failed: object in path "controller" could not be found or was destroyed.

setupController 中,当set之前 调用_super 时,如果我把它放在 _super 之后,它与Error: Assertion Failed: Cannot delegate set('loading', false) to the 'content' property of object proxy &lt;App.ArticlePositionController:ember726&gt;: its 'content' is undefined. 一起吹@call,视图已经调用了didInsertElement 和errs,因为它在模板中找不到正确的div(基本上,为时已晚)。

设置/取消设置“加载”标志的正确钩子是什么?我想我在正确的位置有set loading true,但我不知道在哪里放置set loading false .

the Ember docsactions: { loading: function(transition, originRoute) { // displayLoadingSpinner(); ... 时,如果文档中的示例已经完全开发,它会是什么样子?

【问题讨论】:

  • 加载模板不就是为了这个吗?您可以创建一个名为 position/loading 的模板,它会在路由加载时呈现。
  • 我已经为应用程序准备好了,我尝试了 Position 但它没有做任何事情(按照您的建议添加 position/loading 模板)。当我在 Ember 检查器 Chrome 扩展程序中检查路由时,Ember 正在识别应用程序和文章(即LoadingRouteArticleLoadingRoute)的加载路由,但不是位置。为什么?
  • 也许您需要添加一个{{outlet}}

标签: javascript ember.js


【解决方案1】:

您应该使用内置的加载路径。您可能认为它需要作为需要时间加载的资源的子路由存在,但这是不正确的,它需要是父资源的子路由(这将已经解决)。或者在您的情况下,加载路线需要以ArticleLoadingRoute 的形式存在。它会在任何紧随其下的资源/路由需要时间加载的任何时候显示。

这是一个示例,我强制两个资源需要一段时间才能加载

http://emberjs.jsbin.com/OxIDiVU/465/edit

【讨论】:

  • 太好了,谢谢!我相信我错误地尝试了ArticlesLoadingRoute(拼写错误)
  • 很高兴知道如何使用正确的钩子,以防所需的逻辑超出简单的模板。知道如何实现“displayLoadingSpinner()”,正如 Ember 指南 emberjs.com/guides/routing/loading-and-error-substates 中所建议的那样?
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2014-10-03
  • 2012-06-26
  • 2015-11-15
  • 2021-02-12
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多