2015-05-15 2 views
0

У меня есть «список проектов» в моей заявке. Каждый проект имеет имя, описание и список участников (имя + фамилия).Магистральная/марионетка отделяет виды от получения данных

Похоже, мне нужно получить список проектов (имя, описание и т. Д.) И для каждого списка выборки проектов. Это означает, что у меня есть несколько уровней просмотров, и каждый уровень собирает коллекции и создает экземпляр других представлений/под-представлений.

Все коллекции собираются внутри представлений, инициализируют методы и асинхронно загружаются из службы REST.

Это означает, что я не могу быть уверен, когда именно ListOfProjectView будет готов (из-за подразделам взглядов), и я столкнулся другие проблемы ...

Вопрос - Как правильно использовать взгляды?
1) Является ли это нормальным, если я получаю данные внутри представления или я должен передать полные данные для просмотра?
2) Правильно ли создать экземпляр вида внутри другого представления?

+0

Не то, чтобы это _exactly_ отвечало на ваш вопрос, просто подумал, что это может помочь вам: http://jsforallof.us/2014/10/17/backbone-series-handling-asynchronous-data/ – benhowdle89

ответ

0

Извлечение моделей на initialize заставляет вас получать async, иначе вы запускаете условие гонки, когда коллекция будет пуста к моменту рендеринга.

Обычно я создаю экземпляр своей коллекции и выбираю ее модели перед созданием представления. Я обрабатываю фактический порядок событий, используя обещания. По умолчанию Backbone sync будет реализовывать $.ajax(). Когда вы сделаете выборку, выборка вернет jQuery Promise. Таким образом, на мой взгляд цикл создания будет выглядеть примерно так:

var myView; 
var options = { 
    collection: new MyCollection // Instantiate your collection 
}; 
// the then function takes two callbacks, first for success and a second for failure 
options.collection.fetch().then(function(){ 
    myView = new MyView(options) // Your collection is a property of this options 
           // object. It is guaranteed to have returned from 
           // the fetch and should be full 
    myView.render(); 
}, errorCallback); 

Что касается вашего второго вопроса, то нет ничего плохого обращения с видом в видом, если суб-вид является частью иерархии представлений. Это не единственный способ. Но это чувственно, и в целом я не сталкивался с какими-либо проблемами.

0

Если вы используете марионетка (и вы должны быть), то, что вы описываете следующие:

ListOfProjects который является CompositeView (или CollectionView), который itemView (childView) представляет собой проект, который по сам представляет собой CompositeView, элемент itemView является членом.

марионетки воздадут мнения, когда данные доступны, поэтому если у вас есть простой REST API, он будет делать выполнить следующие запросы:

 
/projects 
/projects/1/members 
/projects/2/members 
... 
/projects/N/members 

Список проектов Окажет после первого запроса и члены каждого проекта будут отобраны сразу после сбора коллекции.

Если вы хотите оптимизировать количество сетевых запросов (если количество проектов велико), то вы можете включить в JSON членов для каждого проекта и переопределить parse method, чтобы вывести участников и конвертировать в соответствующие коллекции.

Смежные вопросы