2013-09-05 3 views
0

Я новичок в Sproutcore и изучаю основы. Я застрял на следующей задаче:Uncaught TypeError: не имеет метода 'storeKeyFor'

У меня есть модель:

Myapp.Space = SC.Record.extend({ 
    id: SC.Record.attr(Number), 
    name: SC.Record.attr(String), 
    creator: SC.Record.toOne('Myapp.User', {isMaster: YES, inverse: 'space'}) 
}); 

Myapp.User = SC.Record.extend({ 
    id: SC.Record.attr(String), 
    name: SC.Record.attr(String) 
}); 

и контроллер:

Myapp.spaces_controller = SC.ArrayController.create(
{ 
     allowsMultipleSelection: NO, 
     selection: null, 
     isEditable: YES 
}); 

В моем источнике данных я делаю удаленный вызов GET:

fetch: function(store, query) { 
      var recordType = query.get('recordType'); 
      var url; 
      if (recordType === Myapp.Space) { 
       url = "spaces" 
      } 
      SC.Request.getUrl(this.baseApiUrl(store) + url).set('isJSON', YES) 
       .notify(this, this._didFetch, { 
        store: store, 
        recordType: recordType 
       }).send(); 
     }, 

_didFetch: function (response, params) { 
      var store = params.store, 
       recordType = params.recordType; 
      if (SC.$ok(response)) { 
       store.loadRecords(recordType, response.get('body')); 
      } 
     }, 

Когда я звоню

Myapp.spaces_controller.set('content', Myapp.store.find(Myapp.Space)); 

(после входа пользователя) Я получаю сообщение об ошибке:

Uncaught TypeError: Object function (props) { 
     this.__sc_super__ = ret.prototype; 
     return this._object_init(props); 
    } has no method 'storeKeyFor' javascript.js?1377681200:11281 
SC.Store.SC.Object.extend.loadRecord javascript.js?1377681200:11281 
SC.Store.SC.Object.extend.loadRecords javascript.js?1377681200:11337 
Myapp.DataSource.SC.DataSource.extend._didFetch data_source.js?1378388369:39 
SC.Response.SC.Object.extend._notifyListeners javascript.js?1377681198:392 
SC.Response.SC.Object.extend.notify javascript.js?1377681198:413 
(anonymous function) javascript.js?1377681198:314 
SC.run javascript.js?1377681203:14741 
SC.Response.SC.Object.extend.receive javascript.js?1377681198:298 
SC.XHRResponse.SC.Response.extend.finishRequest javascript.js?1377681198:628 
SC.mixin.handle javascript.js?1377681199:4249 
(anonymous function) 

я могу получить доступ к объектам в теле ответа, но в магазине не получает данные.

Не удалось найти упоминание об этой ошибке в Интернете. Может ли кто-нибудь помочь?

+0

После публикации вопроса я нашел проблему, у меня возникло противоречивое имя класса. Но теперь я столкнулся с следующей проблемой: я получил ошибку: 'Uncaught TypeError: не могу вызвать метод 'get' из undefined javascript.js? 1377681200: 13225 SC.RecordArray.SC.Object.extend.storeDidChangeStoreKeys javascript.js? 1377681200 : 13225 (анонимная функция) javascript.js 1377681200: 10205 SC.Set.SC.mixin.forEach javascript.js 1377681203: 8171 SC.Store.SC.Object.extend._notifyRecordArrays javascript.js 1377681200: 10204 SC.Store.SC.Object.extend.flush' – ceed

+0

Можете ли вы использовать gist.github.com для создания примера с полным кодом, который терпит неудачу? –

+0

Спасибо, что предложили дополнительную помощь! Я только что решил эту проблему, это было не что иное, как Sproutcore, я забыл установить параметр «запрос» в функции обратного вызова для метода «store.dataSourceDidFetchQuery (query)». Итак, теперь это работает :) – ceed

ответ

0

Ошибка Object function(props) ... has no method 'storeKeyFor' выглядит так, как будто вы пытаетесь вызвать функцию класса, а не на фактический экземпляр этого класса.

Мое первое предположение заключается в том, что ваш recordType устанавливается как фактический класс, а не строка, и это может вызвать некоторые проблемы. В общем, я бы рекомендовал использовать 'MyApp.Space' всякий раз, когда речь идет о типах записей, поскольку это будет оцениваться и обнаруживаться во время выполнения. Если он почему-то не найдет его, он добавит немного более приятное сообщение.

Надеюсь, это поможет!

+0

Большое спасибо, действительно, у меня было другое представление под названием Myapp.Space, так что это разрешено. (Все еще борется со следующей ошибкой, ... :) – ceed