Как вы привязываете данные SC.Record.toMany() SC.Record к ListView?

Я пытаюсь отобразить пользовательский интерфейс с помощью Sproutcore, где у меня есть список списков. Существует вертикальный список данных, в котором каждый связанный элемент имеет собственный список элементов. Я настроил модели так, как считаю нужным, исходя из того, что я знаю о 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
  }),
});

Я добавил subView в ListItemView вертикального списка и изменил подкласс так, чтобы он располагал элементы в горизонтальном списке... ну... горизонтально. У меня проблема в том, что единственный способ, которым я могу получить данные из отношения 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, представляет собой массив чисел, которые соответствуют идентификаторам GUID для элементов в таблице HorizontalData.


person kvn    schedule 22.08.2012    source источник


Ответы (2)


Я думаю, что у вас может быть что-то не так с вашими определениями записей. Если вы ненадолго забудете о представлении списка и просто откроете консоль, можете ли вы взять запись App.VerticalData и спросить ее, что это associatedListOfData?

Пример:

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

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

Если это не распечатывается правильно, значит, у вас проблема с самими записями, а не с представлением.

Здесь мне придется немного угадать, но, поскольку вы не указываете ключ при создании записей, держу пари, что SC просто не сможет связать их вместе. Если у вас нет ключей базы данных associatedListOfData и vertical, это может не сработать.

Если это не поможет, можете ли вы обновить свой код, чтобы показать, как он написан на самом деле, и, возможно, показать нам JSON, который отправляет ваш сервер?

person Topher Fangio    schedule 22.08.2012
comment
Я использую Фикстуры. Таким образом, на данный момент нет JSON с сервера. Я также не могу поделиться реальными данными. Но я могу изо всех сил стараться подражать структуре данных. Я буду фиксировать то, что у меня есть, и делиться этим здесь, насколько это возможно. - person kvn; 23.08.2012
comment
Мне кажется, проблема в том, что данные, которые я получаю с помощью SC.ManyArray, похоже, не работают при привязке к содержимому ListView. Ранее я просмотрел настройку записи и исправил некоторые проблемы, которые у меня были. Но, насколько я могу судить, я теперь послушен. - person kvn; 23.08.2012
comment
Может быть, вы могли бы указать, что такое право. Я не уверен, чего ожидать, если все работает. - person kvn; 23.08.2012

После еще нескольких тестов и экспериментов я думаю, что проблема может быть связана с App.store.dataHashes, не содержащими значений для связанных записей. По-видимому, это должно быть заполнено вручную для ассоциации, чтобы согласовать записи, и не заполняет хранилище автоматически всякий раз, когда SC.ManyArray создается в ассоциации. Я не знаю, является ли это ошибкой Sproutcore или так задумано.

Мне удалось решить эту проблему, заполнив это свойство с помощью запроса к таблице App.HorizontalData, которая вернула все записи, которые я создал для моего FIXTURE. Если в хранилище доступны хешированные данные, использование SC.ManyArray, возвращаемого в качестве содержимого для ListView, работало должным образом.

person kvn    schedule 23.08.2012