emberJS嵌套路由TypeError:无法读取属性'渲染器'未定义的

时间:2014-06-09 11:06:08

标签: ember.js routing

这让我有点生气。这看起来很简单,但我无法让它发挥作用。

这是我的路由器:

App.Router.map(function() {

    this.resource('pages', function() {
        this.resource('page', { path: '/:slug' }, function() {
            this.route('edit');
        });
        this.route('add');
    });
}

问题在于“添加”路线。

以下是设置:

App.PagesAddRoute = Ember.Route.extend({});
App.PagesAddController = Ember.Controller.extend({});
App.PagesAddView = Ember.View.extend({});


// templates/pages/add.hbs
<h1>Add New Page</h1>

templates/pages.hbs中有一个出口,页面模板可以很好地呈现。

我在init方法中添加了console.log所有路由,控制器和视图对象。每个都正确实例化,但当我导航到/ pages / add时,我收到以下错误消息:

TypeError {
    message: "Cannot read property 'rerender' of undefined",
    stack: "TypeError: Cannot read property 'rerender' of undefined
        at CoreView.extend.rerender (http://localhost:9000/bower_components/ember/ember.js:26575:33)
        at null._controllerDidChange (http://localhost:9000/bower_components/ember/ember.js:26494:14)
        at applyStr (http://localhost:9000/bower_components/ember/ember.js:7995:29)
        at sendEvent (http://localhost:9000/bower_components/ember/ember.js:3320:13)
        at notifyObservers (http://localhost:9000/bower_components/ember/ember.js:6226:9)
        at propertyDidChange (http://localhost:9000/bower_components/ember/ember.js:6076:7)
        at set (http://localhost:9000/bower_components/ember/ember.js:6493:13)
        at Descriptor.ComputedPropertyPrototype.set (http://localhost:9000/bower_components/ember/ember.js:1708:11)
        at set (http://localhost:9000/bower_components/ember/ember.js:6461:14)
        at setupView (http://localhost:9000/bower_components/ember/ember.js:38915:7)"
}

我正在运行1.6.0-beta.5(但我在1.5.1中遇到了同样的问题)。有没有人经历过这个?

提前致谢。

更新

这是页面路径,控制器和视图:

App.PagesRoute = Ember.Route.extend({
    model: function() {
        return this.get('store').find('page');
    }
});

App.PagesController = Ember.Controller.extend({});
App.PagesView = Ember.View.extend({});

2 个答案:

答案 0 :(得分:3)

好的,所以这很令人尴尬......

在开发过程中,我在路径,控制器和视图的init方法中记录了一些东西,如下所示:

App.PagesAddRoute = Ember.Route.extend({
    init: function() {
        console.log('PagesAddRoute loaded');
    }
});

这很糟糕......好吧,如果您想调试代码,但是如果您覆盖init方法,请务必使用init调用父this._super()方法}:

App.PagesAddRoute = Ember.Route.extend({
    init: function() {
        console.log('PagesAddRoute loaded');
        this._super(); // Ember.Route.init called, so route loads correctly.
    }
});

这实际上是造成问题的原因......我首先记录内容的原因是因为我最初将模板放在/templates/page/add而不是/templates/pages/add。我的想法是我正在使用Object(页面)而不是Array(页面)......但是,文件系统应该与路由器匹配:

this.resource('pages', function() {
    this.resource('page', { path: '/:slug' }, function() {
        this.route('edit');
    });
    this.route('add'); // add sits within pages, so the path is pages/add
});

希望这可能仍然有助于某人。

答案 1 :(得分:1)

App.PagesAddView = Ember.Controller.extend({});

需要

App.PagesAddView = Ember.View.extend({});