如何将SC.Record的SC.Record.toMany()数据绑定到ListView?

时间:2012-08-22 20:58:16

标签: javascript web sproutcore

我正在尝试使用Sproutcore渲染UI,其中我有一个列表列表。有一个垂直的数据列表,其中每个关联的项目都有自己的项目列表。我根据我对Sproutcore的了解,设置了我认为合适的模型。

型号:

App.VerticalData = SC.Record.extend({
  someField: SC.Record.attr(Boolean),
  associatedListOfData: SC.Record.toMany("App.HorizontalData", {
    inverse: "vertical",
    isMaster: YES
  })
});

App.HorizontalData = SC.Record.extend({
  someForeignKeyField: SC.Record.attr(Number),
  vertical: SC.Record.toOne("App.VerticalData", {
    inverse: "associatedListOfData",
    isMaster: NO
  }),
});

我已经在垂直列表的ListItemView中添加了一个subView并修改了子类,以便它将水平列表中的项目布局......井......水平。我遇到的问题是,我似乎能够从toMany()关系中获取数据以绑定到此水平列表的唯一方法是对垂直列表中的每个项目执行以下操作。

horizontalListView.set('content', App.store.find(SC.Query.local(App.HorizontalData, {
  conditions: 'someForeignKeyField = ' + keyValueOfVerticalItem)
})));

这很痛苦,非常缓慢。我不明白为什么我似乎不能只使用当前垂直列表项的toMany()字段的计算属性的结果。有人可以提供一些指导吗?也许我错过了一些愚蠢的事情。

如果我尝试直接访问该属性,这是我回来的结果:

Object
SproutCore18001994610927067697: "sc1271"
__sc_super__: Object
_bindings: Array[0]
_kvo_cacheable: true
_kvo_changeLevel: 0
_kvo_changes: null
_kvo_cloned: Object
_kvo_content_observed_keys: Object
_kvo_dependents: Object
_kvo_revision: 2
_object_toString: "SC.ManyArray:sc1271"
_observableInited: true
_observers: Array[0]
_prevStoreIds: Array[167]
_properties: Array[15]
_records: null
bindings: Array[0]
manyAttribute: Object
outlets: Array[0]
propertyName: "associatedListOfData"
propertyRevision: 2
record: Object
recordType: App.HorizontalData
__proto__: Object

我不知道这看起来是否正确。所以我可能在我用于测试数据的FIXTURES中仍然没有正确定义的东西。我在associcatedListOfData字段中输入的信息是一个数字数组,它们与Horizo​​ntalData表中元素的GUID对齐。

2 个答案:

答案 0 :(得分:0)

我认为您的记录定义可能有问题。如果您忘记了列表视图,只需打开控制台,您是否可以获取App.VerticalData记录并询问它associatedListOfData是什么?

示例:

var vertical_id = 1;
var vertical = App.store.find('App.VerticalData', vertical_id);

console.log(vertical.get('associatedListOfData'));

如果打印不正确,那么您知道记录本身有问题,而不是视图。

我将不得不在这里猜一下,但由于你在创建记录时没有指定密钥,我打赌SC根本无法将两者捆绑在一起。除非您的数据库密钥是associatedListOfDatavertical,否则它可能无效。

如果这样做无法解决问题,您是否可以更新代码以显示其编写方式,并可能向我们展示服务器发送的JSON?

答案 1 :(得分:0)

经过一些测试和实验后,我认为问题可能与App.store.dataHashes有关,而不包含相关记录的值。这显然必须手动填充关联以协调记录,并且不会在关联中构造SC.ManyArray时自动填充存储。我不知道这是否是Sproutcore中的错误或是否是预期的行为。

我能够通过在App.Horizo​​ntalData表上使用查询填充此属性来解决此问题,该表返回了我为FIXTURE生成的所有记录。如果商店具有可用的散列数据,则使用SC.ManyArray返回,因为ListView的内容按预期工作。