Backbone.js: Как предотвратить множественные загрузки связанной модели?

Да, я знаю, что есть плагин под названием Backbone-Relational, но у меня есть серьезная проблема с функцией fetchRelated, которая, на мой взгляд, делает ее бесполезной для меня.

Вот мне и интересно, есть ли альтернативы? Или нам вообще нужны такие плагины, как Backbone-Relational? Как бы вы справились со следующим сценарием с чистым Backbone:

Допустим, у нас есть две модели Backbone: Company и Person. Экземпляр компании может иметь много лиц. Таким образом, company.get('employees') вернет массив идентификаторов людей. Если я хочу получить информацию о связанных сотрудниках, мне придется перебрать массив и fetch() каждого человека с сервера. Но что, если эти экземпляры Person уже загружены? Есть ли чистый способ убедиться, что нет избыточности?

Может быть, мы сможем поддерживать коллекцию для каждой модели и выгружать в нее каждый экземпляр, который мы загружаем. Тогда мы сможем загрузить экземпляр только тогда, когда его нет в коллекции. Но я думаю, что это сделает код ужасным.

Так что, ребята, поделитесь своим опытом. Спасибо!


person craftsman    schedule 04.04.2013    source источник


Ответы (1)


Как вы предложили, я бы дал моей модели Company атрибут Persons. Но вы, кажется, забываете, что у коллекций также есть метод fetch (а также многие другие методы, которые вы найдете довольно полезно, как метод get).

Кроме того, в заключение я хотел бы процитировать документ Backbone (относительно метода fetch для коллекций):
"Обратите внимание, что fetch не следует использовать для заполнения коллекций при загрузке страницы — все модели нужны при загрузке время уже должно быть загружено на место. fetch предназначен для ленивой загрузки моделей для интерфейсов, которые не нужны немедленно: например, документы с коллекциями заметок, которые можно открывать и закрывать с помощью переключателя."

person Loamhoof    schedule 04.04.2013
comment
Как Collection#fetch помогает предотвратить несколько загрузок одного и того же экземпляра? - person craftsman; 04.04.2013
comment
Извините, кажется, я немного неправильно понял. Ваша коллекция так сильно меняется? Как это меняется? Например, чтобы избежать загрузки одной и той же модели снова и снова с растущей коллекцией, я использовал параметр с самым высоким идентификатором при выборке данных. Кроме того, может ли человек быть частью нескольких коллекций? - person Loamhoof; 04.04.2013
comment
Извините, я не мог понять, что вы имеете в виду под сменой коллекции? Означает ли это добавление/удаление людей в нем? Если это так, то да, люди могут быть добавлены/удалены из него. Да, человек может быть частью нескольких коллекций, и это тот случай, который, я думаю, усложняет задачу. Допустим, у нас есть модель города, в которой может быть много людей. У нас есть экземпляр City London, в котором есть лица p1, p2, p3 и p4 (уже извлеченные). У нас есть компания Virgin, в которой есть лица p3, p4, p5 и p6. Теперь, когда мы выбираем людей для компании Virgin, она повторно выберет p3 и p4 (которые уже были получены). - person craftsman; 04.04.2013
comment
Как я уже сказал, вы все еще можете передавать идентификаторы людей, уже извлеченных в качестве параметра GET, но это может быть довольно некрасиво. Я буду больше думать об этом. - person Loamhoof; 04.04.2013
comment
@craftsman, поскольку сервер понятия не имеет, что он уже отправил (ну, он мог ...), у вас действительно есть только 2 решения. Либо извлеките модели по отдельности, либо используйте параметр GET для отправки списка идентификаторов уже извлеченных моделей. Я действительно не могу думать ни о чем другом. (подумал о volatile-коллекциях, но сервер о них не знал ~~) - person Loamhoof; 04.04.2013