2014-02-28 26 views
2

我在使用ember-data在ember js中加載模型實例時遇到問題。使用函數store.find時會引發異常。實例使用FixtureAdapter創建。 hasMany關係在模型中定義時發生問題。TypeError:無法設置未定義的屬性'store'

App = Ember.Application.create(); 

App.Store = DS.Store.extend({ 
    adapter: DS.FixtureAdapter 
}); 

App.Country = DS.Model.extend({ 
    'name': DS.attr('string'), 
    'cities': DS.hasMany('city', {embedded: true}) 
}); 

App.City = DS.Model.extend({ 
    'name': DS.attr('string'), 
    'country': DS.belongsTo('country') 
}); 

App.City.FIXTURES = [{ 
}]; 

App.Country.FIXTURES = [{ 
    'id': 1, 
    'name': 'USA', 
    'cities': [{id: 1, name: 'New York'}, {id: 2, name: 'San Francisco'}] 
},{ 
    'id': 2, 
    'name': 'Kanada', 
    'cities': [{id: 3, name: 'Montreal'}] 
}]; 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
     var store = this.store; 
     var country = store.find('country', 1); 
     return country; 
    } 
}); 

http://jsfiddle.net/xSq4y/

DEBUG: ------------------------------- ember.js:3496 
DEBUG: Ember  : 1.5.0-beta.2 ember.js:3496 
DEBUG: Ember Data : 1.0.0-beta.7.f87cba88 ember.js:3496 
DEBUG: Handlebars : 1.3.0 ember.js:3496 
DEBUG: jQuery  : 2.1.0 ember.js:3496 
DEBUG: ------------------------------- ember.js:3496 
Error while loading route: TypeError: Cannot set property 'store' of undefined 
    at Ember.Object.extend.modelFor (http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:9812:23) 
    at Ember.Object.extend.recordForId (http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:9265:21) 
    at deserializeRecordId (http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:10196:27) 
    at deserializeRecordIds (http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:10210:9) 
    at http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:10176:11 
    at http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:8517:20 
    at http://builds.emberjs.com/tags/v1.5.0-beta.2/ember.js:3403:16 
    at Object.OrderedSet.forEach (http://builds.emberjs.com/tags/v1.5.0-beta.2/ember.js:3246:10) 
    at Object.Map.forEach (http://builds.emberjs.com/tags/v1.5.0-beta.2/ember.js:3401:10) 
    at Function.Model.reopenClass.eachRelationship (http://builds.emberjs.com/tags/v1.0.0-beta.7/ember-data.js:8516:42) 
+1

的hasMany燈具應該這樣定義IMO 「ID1:城市:[1,2]」 –

+0

THX,它的工作原理類似。我仍然想知道爲什麼不能使用嵌入式語法。 –

+0

是不是有主鍵?=) –

回答

0

如果你的API在該格式返回數據,你可以使用一個序列化器將其轉換爲灰燼數據期待的格式。試試這個:

App.CountrySerializer = DS.RESTSerializer.extend({ 
    normalizePayload: function(type, payload) { 
    var tempCities = payload.country.cities; 
    payload.country.cities = []; 
    tempCities.forEach(function(city) { 
     payload.country.cities.push(city.id); 
    }); 
    payload.cities = tempCities; 
    return this._super(type, payload); 
    }, 
}) 
+0

目前,我想使用沒有服務器連接的燈具。用RESTSerializer可以實現嗎? –

+0

我從來沒有使用燈具,但串行器不關心數據來自何處。您應該可以使用FixtureAdapter來獲取數據,並仍然使用RESTSerializer的子類來處理它。在任何情況下,您都可以覆蓋正在使用的序列化程序的normalizePayload函數。 – Baruch

相關問題