Ember嵌套路线和承诺

时间:2015-03-11 02:55:37

标签: javascript ember.js

使用嵌套路由直接访问ember URL时,应用程序不会在加载嵌套资源之前等待父承诺解析。

以下是一个示例代码:

var App = Ember.Application.create();

App.Router.map(function () {
    this.resource('index', {path: "/"}, function () {
        this.resource('project', {path: "/project/:id"}, function () {
            this.resource('file', {path: "/file/:encodedPath"});
        });
    });
});

App.IndexRoute = Ember.Route.extend({
    model: function () {
        return Ember.$.getJSON('/list-projects');
    }
});

App.ProjectRoute = Ember.Route.extend({
    setupController: function (controller, model) {
        return Ember.$.getJSON('/load-project?id=' + model.id).then(
                function (data) {
                    controller.set('model', data);
                });
    }
});

App.FileRoute = Ember.Route.extend({
    setupController: function (controller, model) {
        var project = this.modelFor('project');
        var url = '/load-file?project=' + project.id + '&path=' + model.encodedPath;

        return Ember.$.getJSON(url).then(
            function (data) {
                controller.set('model', data);
            });

    }
});

是否可以在加载文件数据之前等待项目数据解决?

只有在浏览器中直接加载URL时才会出现此问题: http://mywebsite.com/#/project/1234/file/test.txt

感谢。

1 个答案:

答案 0 :(得分:0)

根据我对你的问题的评论,这应该可以解决问题。请注意model挂钩可以返回Promise,而setupController不应返回任何内容。

这是一个尝试与您的项目对应的JSBin - 显然数据是不同的: http://emberjs.jsbin.com/letalehoje/1/edit?html,js,console,output

确保您也在外部查看它: http://emberjs.jsbin.com/letalehoje/1/#/project/1/file/text1-1.txt

App.ProjectRoute = Ember.Route.extend({
    model: function(params) {
        return Ember.$.getJSON('/load-project?id=' + params.id);
    }
});

App.FileRoute = Ember.Route.extend({
    model: function(params) {
        var projectPromise = this.modelFor('project');

        return Ember.RSVP.resolve(projectPromise).then(function(project) {
            // this is the promise that should be returned for the FileRoute model
            return Ember.$.getJSON('/load-file?project=' + project.id + '&path=' + params.encodedPath);
        });
    }
});