Javascript Ember无法加载双嵌套路由

Javascript Ember无法加载双嵌套路由,javascript,ember.js,handlebars.js,Javascript,Ember.js,Handlebars.js,我现在正在开发一个ember js应用程序,并且有一个路由结构如下的应用程序: App.Router.reopen({ rootURL: '/gui/' }); App.Router.map(function() { this.route("about", { path: "about"}) this.resource("tenant", { path: ":id" }, function() { this.resource("dossier", { p

我现在正在开发一个ember js应用程序,并且有一个路由结构如下的应用程序:

App.Router.reopen({
    rootURL: '/gui/'
});

App.Router.map(function() {
    this.route("about", { path: "about"})
    this.resource("tenant", { path: ":id" }, function() {
        this.resource("dossier", { path: "dossiers/:id"}, function() {
            this.resource("resource", { path: "resources/:id"}, function() {
                this.resource("service", { path: "services/:id"});
            });
        });
    })
});
现在,在最深层的模型(服务)上,当我试图通过键入URL加载服务时,它失败了。比如说,如果我去,
http://localhost:8080/gui#/8080/dossiers/8080/resources/8080/services/8080
,我收到一个错误:

Assertion failed: Cannot call get with 'id' on an undefined object.
我想,可能是我生成模型的代码有问题,但我去掉了所有代码,把模型作为一个裸函数留着看,它仍然给出了这个错误。但是,如果我完全从路由中删除模型代码,它将毫无怨言地加载页面。那么这个,

App.ServiceRoute = Ember.Route.extend({
    model: function(params) {},
    renderTemplate: function() {
        this.render('service', {
            into: 'application'
        });
        this.render()
    }
});
引发一个错误。与原始代码一样:

App.ServiceRoute = Ember.Route.extend({
    model: function(params) {
        tenantModel = this.modelFor('tenant');
        dossierModel = this.modelFor('dossier');
        resourceModel = this.modelFor('resource');
        dossier_url = "/api/" + tenantModel.id + "/dossier/" + dossierModel.tag
        url = dossier_url + "/resources/" + resourceModel.name + "/services/" + params.id
        return jQuery.getJSON(url).then(function(data){
            data
        });
    },
    renderTemplate: function() {
        this.render('service', {
            into: 'application'
        });
        this.render()
    }
});
但是,如果我像这样取出模型:

App.ServiceRoute = Ember.Route.extend({
    renderTemplate: function() {
        this.render('service', {
            into: 'application'
        });
        this.render()
    }
});
然后错误消失了

这是最奇怪的部分

如果我加载另一个页面,然后导航到服务页面。。。它起作用了。它可以很好地加载模型。如果我试图刷新页面,或者将服务的url直接放到浏览器中,它就会吐出来


我在网上读了各种关于这个错误的帖子,但没有一篇与我所看到的情况相匹配——我尝试过调整这个和那个,但仍然一无所获。有什么想法吗?

我想以下几点可以让它发挥作用:

App.ServiceRoute = Ember.Route.extend({
    model: function(params) {
        tenantModel = this.modelFor('tenant');
        dossierModel = this.modelFor('dossier');
        resourceModel = this.modelFor('resource');
        dossier_url = "/api/" + tenantModel.id + "/dossier/" + dossierModel.tag
        url = dossier_url + "/resources/" + resourceModel.name + "/services/" + params.id

        var promise = Ember.Deferred.create();
       jQuery.getJSON(url).then(function(data){
            promise.resolve(data);
        });

        return promise;
    },
    ....
});
关于你的问题的一些评论:

为什么会说:“断言失败:无法在未定义的对象上使用'id'调用get。”?

在您的示例中,模型钩子的实现没有任何作用。因此返回值未定义。调用模型钩子后,Ember似乎再次尝试更新URL。您的映射说它应该使用routes模型的id来完成这项工作。因此它尝试获取未定义对象的id属性

导航到“服务”页面时,它为什么工作?

我猜在这种情况下,您正在为路由提供一个带有
{{{link to}
助手的模型,或者调用
transitiono
。如果提供模型,则不需要调用路由的模型挂钩。当您通过URL输入应用程序时,必须执行模型挂钩

我的解决方案是如何工作的?

您正在通过jQuery.getJSON对进行异步调用。当代码到达模型钩子的末尾时,此请求尚未完成,因此再次返回未定义。相反,我回报了一个承诺。余烬正在等待这个承诺得到解决。我正在jQuery.getJSON的回调中解析它


PS:我不确定您对jQuery.getJSON的调用是否正确。它不需要调用success函数吗。但我不是jquery专家,这可能是完全错误的:-)

男孩是我的脸红了-我应该看到这一点。很抱歉非常感谢你的帮助!别担心。我很高兴这有帮助:-)