Ember.js 余烬力量模板同步之前更长的操作

Ember.js 余烬力量模板同步之前更长的操作,ember.js,Ember.js,我有一些操作需要一些时间,我不想通过显示加载微调器来向用户表明这一点。我知道,有时在显示加载微调器之前,会直接触发较长的运行动作: this.set('betRound.isLoading', true); var _this = this; Ember.run.sync(); Ember.run.later(function(){ _this.transitionToRoute('betround.edit

我有一些操作需要一些时间,我不想通过显示加载微调器来向用户表明这一点。我知道,有时在显示加载微调器之前,会直接触发较长的运行动作:

        this.set('betRound.isLoading', true);
        var _this = this;
        Ember.run.sync();
        Ember.run.later(function(){
            _this.transitionToRoute('betround.edit', _this.get('betRound.content'));
        }, 50);

我试图通过将转换延迟50毫秒来实现这一点,但在一些速度较慢的移动设备上,没有显示依赖于isLoading的加载微调器。

我会使用某种回调机制,您可以将加载微调器放在视图或组件中,并在DOM就绪时通知控制器。下面是一个Mixin示例,您可以将其附加到任何视图或组件,使其在加载后发送通知

App.LoadAware = Ember.Mixin.create({
  didInsertElement: function () {
    this._super();
    var target = this.get("loadedNoticeTarget");
    Ember.assert("We must have loadedNoticeTarget in LoadAware component or view", target);
    target.send("loadAwareLoaded");
  }
});
然后,您可以这样应用它:

App.LoadingSpinnerComponent = Ember.Component.extend(App.LoadAware);
在模板中:

{{#if isLoading}}
  {{loading-spinner loadedNoticeTarget=this}}
{{/if}}
然后,在控制器中:

App.IndexController = Ember.Controller.extend({
  actions: {
    goToSlowRoute: function () {
      this.set("_waitingForSpinner", true);
      this.set("isLoading", true);
    },
    loadAwareLoaded: function () {
      Ember.assert("We must be waiting on spinner at this point", this.get("_waitingForSpinner"));
      this.set("_waitingForSpinner", false);
      this.transitionToRoute("slowRoute");
    }
  },
  isLoading: false
});

在本例中,您将通过向控制器发送goToSlowRoute消息来启动转换。完整的JSBin。

您不使用内置加载机制有什么原因吗?您是指模型挂钩吗?或者您指的是哪种内置功能?我想显示旧路线,直到新路线准备就绪,但同时要指示一个旋转器。在这种特殊情况下,我不想输入加载子例程,因为我希望尽可能长时间地显示旧的加载子例程。我指的是加载子例程。缓慢只是呈现到页面的模板,对吗?您不需要等待任何异步请求返回。没错,速度慢是由大量计算的属性和渲染造成的。这就是为什么我采用了这种丑陋的变通方法。这似乎是可行的,但我随机体验到这种转变从未发生过。可能是因为不满足断言条件?虽然我还不完全明白你为什么需要这个_waitingForSpinner。因为我将根据isLoading渲染它,并且loadAwareLoaded会在渲染后立即触发。是的,在您的情况下,您可以删除_waitingForSpinner并只使用isLoading。前者更像是一种通用模式,如果您想为其他事情调用微调器,那么它也很有用。检查控制台以查看断言是否失败。