问题与Ember的装载子状态

时间:2014-03-28 21:31:18

标签: javascript web ember.js

我的应用程序有一个常见的加载Ux,在加载过程中我希望我的大多数路由做一件事,显示一个微调器。为了实现这一点,我通过覆盖加载方法将该行为一直放到ApplicationRoute:

App.ApplicationRoute = Ember.Route.extend({
   actions: {
       loading: function() {
           console.log("Show loading spinner");
           return true;
       }
   } 
});

但是,我的一个嵌套路线我想做一些更自定义而不显示微调器的东西,而是使用自定义模板。我希望覆盖该嵌套级别的加载,而不是将加载消息冒泡到ApplicationRoute,但这会产生不渲染模板的负面影响。如果我冒泡了,那么我看到了我的模板,我看到了一个加载微调器。

JS-fiddle强调了这个问题:http://jsfiddle.net/ssirowy/P8azn/4/

我的方法在哪里错了?我应该在所有路由中实现'loading'并调用loadSpinner方法,但我感兴趣的嵌套路由除外?还有其他方法吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

所以经过一段时间的努力,我最终以不同的方式实现了上述内容。我没有在ApplicationRoute中捕获所有路径并显示微调器,而是在ApplicationController上实现了一个名为showSpinner的基本方法,然后所有想要显示微调器的路径必须通过实现加载和调用showSpinner方法来选择。

App.ApplicationController = Ember.Controller.extend({

    //... other functionality

    // Methods to show a spinner in main body of app
    showSpinner: function() {
        console.log('SPINNER!');
    }
};  

因为我有几条路线实现了这种精确的加载行为,所以我创建了一个简单的mixin来显示覆盖加载方法的微调器:

App.ShowSpinner = Ember.Mixin.create({
    actions: {
        loading: function(transition, originRoute) {
           this.controllerFor('application').showSpinner();
           return true;
        }
    }
});

并通过这样做来利用它:

App.RouteThatWantsSpinner = Ember.Route.extend(App.ShowSpinner, {
    model: function() {
        return something;
    }
});

另一个更符合原始问题的答案会很棒,但此解决方案现在适用于我