2013-04-14 3 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; 
    } 
}); 

키가 누락되었습니다.

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이 있습니다 :

인 나는이 데이터 소스가 단지 하나의 객체를 포함 할,하지만 난 그것을 내용

내 ready_state.js을 반환하는 방법을 잘 모르겠습니다

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

어떤을 반환하지 않습니다 :

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

다시 말하지만, 어떤 문제가 있다는 것입니다 것으로 보인다 내용 및 나는 왜 확실하지 않다.

모든 것이 제대로 작동하면 CascadingDatasource.itemController에 보관되는 결과의 '이름'및 'ph'속성에 바인딩되어야하는 기본 페이지의 SC.LabelView가 있습니다. 그러나 현재 기본 페이지는 비어 있습니다.

현재 Chrome 콘솔에 오류가 표시되지 않습니다.

답변

1

좋아, 프로젝트를 복제 한 후, 나는 진짜 문제를 발견 할 수 있었다.

fetch의 문서에 따르면 모든 것을 올바르게 업데이트 할 수 있도록 상점에서 loadQueryResults으로 전화해야합니다.다음에 코드를 변경하고 나를 위해 작동이 작동하지 않는 경우

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

store.loadQueryResults(query, [storeKey]); 

가 나는 또한 적절한 수정 당신에게 끌어 오기 요청을 보낼 수 있지만 내 텍스트 편집기가에 재미 모든 일을했다 실제 파일은 탭 대신 공백을 사용하기 때문에 다음과 같습니다. -P

+0

완벽. 고맙습니다. github 소스를 업데이트합니다. – ericg

1

documentation에 따르면 Store.find()과 쿼리를 함께 사용하면 모델 개체가 아닌 SC.RecordArray가 반환됩니다.

내가 SC.ArrayController가되도록 store.find(...)의 반환 값을 설정 한 다음 별도의 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