0

我已将完整的源代码放在https://github.com/ericgorr/myproject.git和 cascading_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 应该绑定到 CascadingDatasource.itemController 中保存的结果的“名称”和“ph”属性。但是,目前,主页是空白的。

我目前在 Chrome 控制台中没有看到任何错误。

4

2 回答 2

1

好的,所以在克隆您的项目之后,我能够找到真正的问题。

根据fetch上的文档,您必须在 store 上调用loadQueryResults以便它知道正确更新所有内容。将您的代码更改为以下内容,它适用于我:

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

store.loadQueryResults(query, [storeKey]);

如果这不起作用,我也可以向您发送带有适当修复的拉取请求,但是我的文本编辑器对实际文件做了各种有趣的事情,因为我使用空格而不是制表符:-P

于 2013-04-16T13:06:36.540 回答
1

根据文档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();
  }
});

这应该确保标签视图获得一个要渲染的对象。

于 2013-04-15T14:59:00.360 回答