簡體   English   中英

Ember.js ArrayController錯誤

[英]Ember.js ArrayController error

我正在嘗試測試以下示例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:對象函數(){如果(!wasApplied){Class.proto(); //准備原型...} o_defineProperty(this,GUID_KEY,undefinedDescriptor); o_defineProperty(this,'_super',undefinedDescriptor); var m = meta(this),proto = m.proto; m.proto = this; if(initMixins){//本地捕獲,因此我們可以清除變量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不再支持其他定義的混合,請改用createWithMixins。”,!(Ember.Mixin的屬性instance); 如果(typeof屬性!=='對象'&&屬性!==未定義){拋出新的Ember.Error(“ Ember.Object.create只接受對象。”); }如果(!properties){繼續; } var keyNames = Ember.keys(properties); for(var j = 0,ll = keyNames.length; j <ll; j ++){var keyName = keyNames [j]; 如果(!properties.hasOwnProperty(keyName)){繼續; } var value = properties [keyName],IS_BINDING = Ember.IS_BINDING; 如果(IS_BINDING.test(keyName)){var bindings = m.bindings; if(!bindings){綁定= m.bindings = {}; }否則if(!m.hasOwnProperty('bindings')){綁定= m.bindings = o_create(m.bindings); } bindings [keyName] =值; } 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.ActionHandler時,必須在擴展時間提供Ember.assert(“ actions ,而不是在創建” +“時間(即視圖,” +“控制器和路由)。”,!((keyName ==='actions ')&& Ember.ActionHandler.detect(this))); if(concatenatedProperties && indexOf(concatenatedProperties,keyName)> = 0){var baseValue = this [keyName]; if(baseValue){if('function'=== typeof baseValue.concat){value = baseValue.concat(value); } else {value = Ember.makeArray(baseValue).concat(value); }} else {value = Ember.makeArray(value); }} if(desc){desc.set(this,keyName,value); } else {if(typeof this.setUnknownProperty ==='function'&&!(this中的keyName)){this.setUnknownProperty(keyName,value); } else if(MANDATORY_SETTER){Ember.defineProperty(this,keyName,null,value); //設置強制設置器} else {this [keyName] = value; }}}}} finishPartial(this,m); this.init.apply(this,arguments); m.proto = proto; finishChains(本); sendEvent(this,“ init”); }沒有方法'get'

我也遇到了同樣的問題,就像我在看同一本書一樣,最終弄清楚了為什么在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);
}});

在多次試驗前后,我遇到了相同的問題,問題出在控制器名稱的拼寫和大小寫上。 例如(根據您的問題代碼)調用:

MovieTracker.moviesController.get('length');

而控制器的名稱是MoviesController,並以大寫M表示,則會出現此錯誤。 因此,請仔細檢查您的代碼,確保您使用正確的名稱和正確的大小寫。

將控制器名稱保留為大寫M也是一個好習慣,如@ kingpin2k建議

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

“創建”非常適合本書中的示例。 下面的代碼為我工作

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

版本

調試:灰燼:1.5.0調試:把手:1.1.2調試:jQuery:1.10.2

灰燼調試器活動VM2276:161 MovieTracker.MoviesController.get('length');

2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM