【问题标题】:Ember js, show spinner when something is loading in backgroundEmber js,在后台加载某些内容时显示微调器
【发布时间】:2016-09-19 22:29:06
【问题描述】:

当我的页面中的某些内容正在加载某些内容时,EmberJS 有没有办法在某处显示加载模板?

例如,我有一个页面,其中包含许多歌曲艺术家,每个人都有许多歌曲。我加载了艺术家的页面,很好,但在后台我正在加载有关每个人的歌曲的信息。 我只需要某个地方的加载微调器,告诉我该网站正在加载某些内容(例如,Chrome 开发者工具的“网络”选项卡中有待处理的内容...)

如何以如此优雅的 Emberjs 方式做到这一点?

【问题讨论】:

    标签: asynchronous ember.js ember-data loading ember-cli


    【解决方案1】:

    你可以像这样观察Ember.PROMISEPROXYMIXIN的isPending属性:

    {{#if artist.songs.isPending}}
      loading...
    {{/if}}
    

    【讨论】:

    • 我不明白,你能解释一下吗?
    • 如果我需要在应用程序状态下加载?每次加载整个应用中的某些内容时都会出现的内容?
    • 您可以在与应用程序模板相同的根级别创建加载模板。 guides.emberjs.com/v2.8.0/routing/loading-and-error-substates
    • 但是isPending 改变了,不是吗?如果我正在加载 Artists.songs,应用程序路由的根级别中的 isPending 是什么?
    • 这取决于您要达到的目标。如果您在路由器转换到另一个路由时想要一个加载模板,您可以创建一个应用程序加载模板,但如果您想要在模型加载时显示一个加载模板,您可以观察isPending 或任何传达模型状态的 mixin 属性。 emberjs.com/api/classes/Ember.PromiseProxyMixin.html
    【解决方案2】:

    据我所知(基于对 API 文档的快速阅读)Ember 没有提供实现此目的的内置方法。除非我错了,否则这意味着您需要自己实现请求状态跟踪。

    您可以在 Ember 的适配器层中执行此操作(例如,在 app/adapters/application.js 中添加代码),但最简单的解决方案可能是直接使用 jQuery。您可以使用一些 API:

    我建议创建一个Ember.Service 来跟踪这个状态——然后你可以将它注入任何需要根据这个信息呈现模板的控制器或组件中。您的服务可能如下所示:

    import Ember from 'ember';
    
    export default Ember.Service.extend({
    
      init() {
        this._super(...arguments);
        const invalidateRequestInProgress = () => {
          this.notifyPropertyChange('dummyProperty');
        }
    
        $(document).ajaxStart(invalidateRequestInProgress);
        $(document).ajaxStop(invalidateRequestInProgress);
      },
    
      requestInProgress: Ember.computed('dummyProperty', function() {
        return Ember.$.active !== 0;
      }),
    
    });
    

    我还没有测试过这段代码,所以我不确定它是否能在实践中工作:)

    【讨论】:

    • 我正在尝试您建议的方法,效果很好。但是你能更好地解释一下这段代码是做什么的吗?具体来说,我会明白,notifyPropertyChange 是必要的吗?使用Ember.computed 是性能证明吗? return Ember.$.active !== 0; 究竟是什么?我们有好的表现吗?究竟是什么加载了 Ember 的默认加载 (guides.emberjs.com/v2.8.0/routing/loading-and-error-substates),因为在 ajax 调用服务器期间没有加载,然后我们不得不求助于这些手动方法?
    • (1) notifyPropertyChange 告诉 Ember 任何依赖于 'dummyProperty' 的计算属性都需要重新计算。这是缓存失效。 (2) 使用 Ember.computed 可以在模板中检查 requestInProgress。 (3) Ember.$.active !== 0;$.active !== 0; 相同,除了使用 Ember 命名空间的 jQuery 副本——以防页面上定义了多个 $s。对于$.active 的含义,请查看我的答案中的链接。
    • (4) 您链接到的文章中的“正在加载子状态”仅在等待从路由的model hook 返回的 Promise 时才处于活动状态。 Ember 无法知道您进行的任意 AJAX 调用。
    • 最后——我意识到将 notifyPropertyChange 与计算属性一起使用可能会让新手感到困惑。我相信这是最好的风格,因为它更懒而且更实用,但你也可以通过将 invalidateRequestInProgress 定义为 () => { this.set('requestInProgress', Ember.$.active !== 0); } (这是急切的)来不同地编写它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2013-07-21
    • 2021-11-06
    • 2014-08-23
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多