Ember.js ArrayController错误

时间:2014-02-15 22:22:53

标签: javascript ember.js ember-testing

我正在尝试测试以下示例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(这个,GUID_KEY,   undefinedDescriptor); o_defineProperty(this,'_ super',   undefinedDescriptor); var m = meta(this),proto = m.proto; m.proto =   这个; if(initMixins){//在本地捕获所以我们可以清除已关闭的   over variable var mixins = initMixins; initMixins = null;   this.reopen.apply(this,mixins); } if(initProperties){//捕获   本地,所以我们可以清除关闭变量var props =   initProperties; initProperties = null; var concatenatedProperties =   this.concatenatedProperties; for(var i = 0,l = props.length; i< l;   i ++){var properties = props [i]; Ember.assert(“Ember.Object.create no   更长时间支持在其他定义中混合,请使用createWithMixins   相反。“,!(属性instanceof Ember.Mixin)); if(typeof   属性!=='对象'&& properties!== undefined){throw new   Ember.Error(“Ember.Object.create只接受对象。”);如果   (!属性){继续; } var keyNames = Ember.keys(properties);对于   (var j = 0,ll = keyNames.length; j< ll; j ++){var keyName =   键名[J]; if(!properties.hasOwnProperty(keyName)){continue; }   var value = properties [keyName],IS_BINDING = Ember.IS_BINDING;如果   (IS_BINDING.test(keyName)){var bindings = m.bindings; if(!bindings)   {bindings = m.bindings = {};否则如果   (!m.hasOwnProperty('bindings')){bindings = m.bindings =   O_CREATE(m.bindings); } bindings [keyName] = value; } var desc =   m.descs [的keyName]; Ember.assert(“Ember.Object.create不再支持   定义计算属性。“,!(value instanceof   Ember.ComputedProperty)); Ember.assert(“Ember.Object.create不再   支持定义调用_super的方法。“,!(typeof value ===   '功能'&& value.toString()。indexOf('._ super')!== -1));   Ember.assert(“actions必须在延长时间提供,而不是在创建时提供   “+”时间,当使用Ember.ActionHandler时(即视图,“+   “控制器和路线”。,!((keyName ==='actions')&&   Ember.ActionHandler.detect(本))); if(concatenatedProperties&&   indexOf(concatenatedProperties,keyName)> = 0){var baseValue =   这[的keyName]; if(baseValue){if('function'=== typeof   baseValue.concat){value = baseValue.concat(value); } else {value =   Ember.makeArray(baseValue).concat(值); }} else {value =   Ember.makeArray(值); if(desc){desc.set(this,keyName,   值); } else {if(typeof this.setUnknownProperty ==='function'&&   !(此处为keyName)){this.setUnknownProperty(keyName,value);其他   if(MANDATORY_SETTER){Ember.defineProperty(this,keyName,null,   值); //设置强制setter} else {this [keyName] = value; }}   } finishPartial(this,m); this.init.apply(this,arguments);   m.proto = proto; finishChains(本); sendEvent(this,“init”); } 没有   方法'get'

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,因为我也跟着同一本书,终于弄明白为什么这不适用于Ember 1.5.1:

  1. 如上所述,应该使用MoviesController的资金而不是moviesController。
  2. 应该延伸掉Ember.ArrayController而不是创建它。
  3. 请勿使用this._super()
  4. 所以下面的代码应该适用于任何感兴趣的人......

    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);
    }});
    

答案 1 :(得分:1)

在很多试验之前和之后我遇到了同样的问题,问题出在控制器名称拼写和案例中。例如(根据您的问题代码)调用:

MovieTracker.moviesController.get('length');

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

将控制器名称保留为大写M作为@ kingpin2k推荐

也是一种很好的做法

答案 2 :(得分:-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);
       }
});

答案 3 :(得分:-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);
}       
});

版本

DEBUG:Ember:1.5.0 调试:把手:1.1.2 DEBUG:jQuery:1.10.2

Ember Debugger Active VM2276:161 MovieTracker.MoviesController.get( '长度');

2