我正在尝试测试以下示例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'
答案 0 :(得分:2)
我遇到了同样的问题,因为我也跟着同一本书,终于弄明白为什么这不适用于Ember 1.5.1:
所以下面的代码应该适用于任何感兴趣的人......
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