Когда создавать новые модели представления в Knockout.js

Я заметил, что, когда речь идет о нескольких моделях представления в knockout.js, обычно возникает некоторая путаница.

Документация ko на самом деле не очень подробно объясняет, как работать с несколькими моделями представления, как взаимодействовать между ними и когда их следует учитывать.

Я нашел этот сайт объясняя различные способы создания нескольких моделей представлений и способы взаимодействия с ними.

Я попробовал и создал мастер-модель с разными подмоделями:

var MasterModel = function(){
    this.orders = new ordersViewModel(),
    this.dates = new datesViewModel(),
    this.equipment = new equipmentViewModel();
};

После этого мне пришлось использовать with: nameOfModel во многих местах (и создавать для него дополнительные оболочки или HTML-комментарии) или даже просто использовать имя модели представления в качестве префикса data-bind="foreach: orders.getList()".

Кроме того, у нас есть проблема связи между ними, и хотя ее можно каким-то образом решить, она не кажется такой простой, как при работе с одной моделью представления.

У меня вопрос: стоит ли создавать несколько моделей представления? Если да, то когда? Кажется, это только добавляет сложности, и я не вижу в этом преимуществ. (да, они говорят, что он поддерживает модульность ... но я не вижу явного преимущества)


person Alvaro    schedule 02.07.2015    source источник


Ответы (2)


Я согласен с Анишем Пателем в том, что это зависит и касается разделения задач и сохранения ваших классов в соответствии с принципом единой ответственности (делайте только одно действие с каждым классом, что мне было трудно сделать с моделями представления). Возможно, вам также придется подумать о том, чтобы ваши модели представления можно было тестировать с помощью Jasmine или другой тестовой среды JS.

На мой взгляд, использование with: в HTML - неплохой подход.

RequireJs может помочь сделать вещи модульными и заставить работать зависимости.

ko.postbox позволяет вам публиковать / подписывать сообщения между моделями представления без необходимости связывать их вместе . Это было в упомянутой вами ссылке. Вы также можете общаться, передавая функции обратного вызова в ваши модели представления.

Дюрандаль - хорошее предложение. Меня также интересует Aurelia Роба Айзенберга, создателя Durandal, но с 7 он все еще находится в стадии бета-тестирования. / 2/2015. Это загрузит модули со стандартизованными SystemJ и упростит создание модульных моделей представлений.

person AlignedDev    schedule 02.07.2015
comment
Я до сих пор не понимаю, почему вы говорите, что Аурелия или Дюрандаль могут помочь вам лучше организовать модули. - person Alvaro; 23.09.2015
comment
@Alvaro Я думал о системе внедрения и загрузки зависимостей Auerlia, которая более интегрирована, чем необходимость вводить различные части (KO, RequireJs и т. Д.). У обоих есть преимущества, и ответственность за написание хорошего модульного кода лежит на разработчике, но иногда фреймворки могут упростить задачу. Примеры Аурелии также кажутся хорошим руководством, хотя я пока лишь бегло просматривал Аурелию. - person AlignedDev; 23.09.2015

Нет никаких жестких правил относительно того, сколько моделей представлений следует использовать или следует ли использовать одну модель представления, охватывающую все.

Все зависит от сложности приложения, которое вы создаете, и от того, хотите ли вы инкапсулировать и модулировать части функциональности для повторного использования или просто разумности.

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

После этого мне пришлось использовать with: nameOfModel во многих местах (и создавать для него дополнительные оболочки или HTML-комментарии) или даже просто использовать имя модели представления в качестве префикса data-bind = "foreach: orders.getList ()" .

Я использую структуру под названием DurandalJS, которая способствует модульности и композиции. Он также предоставляет некоторые замечательные функции, такие как маршрутизация и обмен сообщениями. Композиция DurandalJS может помочь вам сократить количество с: привязками, поскольку она использует ko.applyBindings для привязки моделей представлений и представлений к элементам на странице.

person Anish Patel    schedule 02.07.2015