2013-04-14 4 views
0

У меня есть полный источник на https://github.com/ericgorr/myproject.git с приложением cascading_datasource.Настройка источника SC.DataSource, который содержит только один объект

У меня есть item_model.js со следующим кодом:

CascadingDatasource.Item = SC.Record.extend(
{ 
     name:  SC.Record.attr(String), 
     ph:  SC.Record.attr(String) 
}); 

CascadingDatasource.Item.itemQuery = SC.Query.remote(CascadingDatasource.Item, { targetDataSource: 'itemDataSource' }); 

Моего data_source.js является:

sc_require('data_sources/itemDataSource'); 

CascadingDatasource.dataSource = SC.CascadeDataSource.create(
{ 
     dataSources: ['itemDataSource'], 

     itemDataSource: CascadingDatasource.itemDataSource, 

}); 

Моего itemController.js является:

CascadingDatasource.itemController = SC.ObjectController.create({ 
}); 

Моего itemDataSource .js:

sc_require('models/item_model'); 

CascadingDatasource.itemDataSource = SC.DataSource.create(
{ 
    fetch: function(store, query) 
    { 
     var handled  = false, 
      itemRecord; 

     if (query.recordType === CascadingDatasource.Item && query.targetDataSource === 'itemDataSource') 
     {  
      CascadingDatasource.store.loadRecord(CascadingDatasource.Item, { 
       name: 'the name', 
       ph:  'the phone number' 
      }); 

      var theRecords = CascadingDatasource.store.recordsFor(CascadingDatasource.Item); 

      // Indicate that we took this request. 
      handled = true; 
     } 

     return handled; 
    } 
}); 

Именно здесь у меня отсутствует ключевой кусок. Я хочу, чтобы этот источник данных содержит только один объект, но я не знаю, как вернуть его содержание

Моего ready_state.js является:

CascadingDatasource.ReadyState = SC.State.extend({ 

    enterState: function() 
    { 
     CascadingDatasource.itemController.set('content', CascadingDatasource.store.find(CascadingDatasource.Item.itemQuery)); 

     CascadingDatasource.getPath('mainPage.mainPane').append();   
    }, 

    exitState: function() 
    { 
     CascadingDatasource.getPath('mainPage.mainPane').remove(); 
    } 

}); 

У меня есть SC.LabelView со следующим:

valueBinding: SC.Binding.oneWay('CascadingDatasource.itemController.name') 

Опять же, что, как представляется, проблема заключается в том, что:

CascadingDatasource.store.find(CascadingDatasource.Item.itemQuery) 

не возвращает и я не уверен, почему.

Если все работает правильно, на главной странице должен находиться SC.LabelView, который должен быть привязан к свойствам «name» и «ph» результата, содержащегося в CascadingDatasource.itemController. Однако в настоящее время основная страница пуста.

В настоящее время у меня нет ошибок на консоли Chrome.

ответ

1

Хорошо, поэтому после клонирования вашего проекта я смог найти реальную проблему.

В соответствии с документами на fetch, вы должны позвонить в магазин loadQueryResults, чтобы он знал, что нужно все правильно обновить.Измените свой код к следующему, и это работает для меня:

var storeKey = CascadingDatasource.store.loadRecord(CascadingDatasource.Item, { 
    name: 'the name', 
    ph:  'the phone number' 
}); 

store.loadQueryResults(query, [storeKey]); 

Я также могу отправить вам запрос тянуть с соответствующими исправлениями, если это не работает, но мой текстовый редактор сделал все виды забавных вещей к фактические файлы, потому что я использую пробелы вместо вкладок: -P

+0

Perfect. Спасибо. Будет обновлен источник github. – ericg

1

Согласно documentation, Store.find() при использовании с запросом возвращает SC.RecordArray, а не объект модели.

Я бы рекомендовал установить значение, возвращаемое store.find(...) быть SC.ArrayController, а затем с отдельным SC.ObjectController связан с .firstObject свойством, что один так:

CascadingDatasource.arrayController = SC.ArrayController.create({ 
}); 

CascadingDatasource.itemController = SC.ObjectController.create({ 
    contentBinding: SC.Binding.oneWay('CascadingDatasource.arrayController.firstObject') 
}); 

CascadingDatasource.ReadyState = SC.State.extend({ 
    enterState: function() { 
    CascadingDatasource.arrayController.set('content', CascadingDatasource.store.find(CascadingDatasource.Item.itemQuery)); 

    CascadingDatasource.getPath('mainPage.mainPane').append(); 
    }, 

    exitState: function() { 
    CascadingDatasource.getPath('mainPage.mainPane').remove(); 
    } 
}); 

Это должно гарантировать, что мнения этикетки получить один объект для рендеринга.

+0

Ваши предложенные изменения имеют смысл, но все же приложение не работает нормально. Предполагая, что это можно заставить работать, я по-прежнему считаю, что основная проблема связана с моим источником данных. Неясно, обеспечивает ли он его содержание ожидаемым образом. Я обновил свой проект github с вашими предложенными изменениями. – ericg