1

我正在尝试测试以下示例 Ember.js 代码,但我总是在 Chrome 浏览器控制台中显示以下错误:

Uncaught TypeError: Property '_super' of object [object Object] is not a function

代码:

MovieTracker.moviesController = Ember.ArrayController.create({
       content: [],
       init: function(){
           this._super();
           var list = [
               MovieTracker.Movie.create({
                   title: 'Movie 1',
                   rating: 4 }),
               MovieTracker.Movie.create({
                   title: 'Movie 2',
                   rating: 5
               })];
           this.set('content', list);
       }
});

我正在使用 Ember-1.3.2.js

有人可以告诉我我在这里缺少什么吗?以及如何解决这个错误?

按照@kingpin2k 的建议将 .create 更改为 .extend 后的新错误消息

TypeError: Object function () { if (!wasApplied) { Class.proto(); // 准备原型... } o_defineProperty(this, GUID_KEY, undefinedDescriptor); o_defineProperty(this, '_super', undefinedDescriptor); var m = meta(this), proto = m.proto; m.proto = 这个;if (initMixins) { // 本地捕获,这样我们就可以清除关闭的变量 var mixins = initMixins; 初始化混合 = 空;this.reopen.apply(this, mixins); } if (initProperties) { // 本地捕获,以便我们可以清除关闭的变量 var props = initProperties; 初始化属性=空;var concatenatedProperties = this.concatenatedProperties; for (var i = 0, l = props.length; i < l; i++) { var properties = props[i]; Ember.assert("Ember.Object.create 不再支持混入其他定义,请改用 createWithMixins。", ! (Ember.Mixin 的属性实例));if (typeof properties !== 'object' && properties !== undefined) { throw new Ember.Error("Ember.Object.create 只接受对象。"); } if (!properties) { 继续;} var keyNames = Ember.keys(properties); for (var j = 0, ll = keyNames.length; j < ll; j++) { var keyName = keyNames[j]; if (!properties.hasOwnProperty(keyName)) { 继续;} var 值 = 属性 [keyName],IS_BINDING = Ember.IS_BINDING;if (IS_BINDING.test(keyName)) { var bindings = m.bindings; if (!bindings) { bindings = m.bindings = {}; } else if (!m.hasOwnProperty('bindings')) { bindings = m.bindings = o_create(m.bindings); } 绑定[键名] = 值;} var desc = m.descs[keyName]; Ember.assert("Ember.Object.create 不再支持定义计算属性。", ! (Ember.ComputedProperty 的值实例));Ember.assert("Ember.Object.create 不再支持定义调用_super的方法。", !(typeof value === 'function' && value.toString().indexOf('._super') !== -1 )); Ember.assert("actions价值); // 设置强制设置器 } else { this[keyName] = value; } } } } } 完成部分(这个,米);this.init.apply(this, arguments); m.proto = 原型;完成链(这个);发送事件(这个,“初始化”);没有方法'get'

4

4 回答 4

2

我也遇到了同样的问题,因为我也在关注同一本书,终于弄清楚为什么这在 Ember 1.5.1 上不起作用:

  1. 如前所述,应该为 MoviesController 而不是 moviesController 使用大写字母。
  2. 应该扩展 Ember.ArrayController 而不是创建它。
  3. 不要使用 this._super()

所以下面的代码应该适用于任何有兴趣的人......

MovieTracker.MoviesController = Ember.ArrayController.extend({
content: [],
init: function() {
    var list = [
        MovieTracker.Movie.create({
            title: 'Movie 1',
            rating: 4
        }),
        MovieTracker.Movie.create({
            title: 'Movie 2',
            rating: 5
        })];

    this.set('content', list);
}});
于 2014-05-01T22:03:53.093 回答
1

在进行大量试验之前和之后,我都遇到了同样的问题,问题在于控制器名称的拼写和大小写。例如(根据您的问题代码)调用:

MovieTracker.moviesController.get('length');

而控制器的名称是带有大写 M 的 MoviesController 会给你这个错误。因此,请尝试仔细检查您的代码,确保您的名称正确且大小写正确。

正如@kingpin2k 推荐的那样,将控制器名称保持为大写 M 也是一个好习惯

于 2014-02-16T09:01:39.413 回答
-1

'create' 非常适合本书中的示例。下面的代码对我有用

MovieTracker.MoviesController = Ember.ArrayController.create({
content: [],
init: function(){
var list = [    
        MovieTracker.Movie.create({
            title: 'The Avengers',
            rating: 4
        }),
        MovieTracker.Movie.create({
            title: 'Spiderman',
            rating: 5
        })];
    this.set('content', list);
}       
});

版本

调试:Ember:1.5.0 调试:车把:1.1.2 调试:jQuery:1.10.2

Ember 调试器活动 VM2276:161 MovieTracker.MoviesController.get('length');

2

于 2014-05-06T02:06:49.923 回答
-1

MoviesController应该大写,你应该扩展Ember.ArrayController而不是创建它。

MovieTracker.MoviesController = Ember.ArrayController.extend({
       content: [],
       init: function(){
           this._super();
           var list = [
               MovieTracker.Movie.create({
                   title: 'Movie 1',
                   rating: 4 }),
               MovieTracker.Movie.create({
                   title: 'Movie 2',
                   rating: 5
               })];
           this.set('content', list);
       }
});
于 2014-02-15T22:47:11.497 回答