2015-07-02 2 views
1

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

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

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

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

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

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

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

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

ответ

2

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

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

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

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

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

+2

Yay for aurelia: D –

+0

У меня все еще нет четкого объяснения, почему вы говорите, что Aurelia или Durandal могут помочь вам лучше организовать модули. – Alvaro

+0

@ Alvaro Я думал о системе инъекций и загрузки зависимостей Auerlia, которая более интегрирована против необходимости вносить разные части (KO, RequireJs и т. Д.). У обоих есть преимущества, и писать хороший модульный код - это ответственность разработчика, но иногда фреймворки могут облегчить ситуацию. Примеры Aurelia также, по-видимому, являются хорошим руководством, хотя я пока что снял поверхность Aurelia. – Aligned

2

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

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

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

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

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

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