Основываясь на ваш вопрос, я бы сказал, что вы, вероятно, работает в этой общей задачи по двум взаимосвязанным причинам -
- Вы используете основную основу исключительно, а не каркас, такой как Marionette или Chaplin.
- Ваши взгляды «слишком велики» и пытаются включить слишком много материала в единый вид.
Я почти никогда не включаю логику в шаблоны, и это потому, что мне почти никогда не нужно. Это потому, что я написать много очень маленьких просмотров, и их вместе, чтобы сделать большие виды. Marionette'sviewclasses сделать это очень легко сделать, по subclassing the backbone view into different view types, добавив дополнительные утилиты и резкое сокращение на шаблоне. Marionette также очень хорошо справляется с вложенными представлениями, что действительно позволяет вам развернуть и создать точный инструмент просмотра, который вам нужен для конкретного варианта использования.
Невозможно определить полезный вид с помощью Marionette в 1-2 строках кода, что дает вам большую гибкость, чтобы сделать очень маленькие, эффективные виды. Недостатком создания большого количества мелких просмотров является то, что для написания кода очень много кода, и его может стать трудно поддерживать, но Marionette makes that disadvantage relatively insignificant. Мэрионетта заняла у меня всего пару дней, чтобы получить поддержку, и я настоятельно рекомендую интегрировать ее в свои приложения с базой данных именно для этой проблемы.
Когда ваши взгляды большие, и старайтесь делать слишком много, вы завершаете проблему, которую описываете - вам нужно изменить их слишком сильно, чтобы соответствовать вашим потребностям, и ваш код становится уродливым и трудным читать. Когда у вас много мелких просмотров, они очень отзывчивы и мало нуждаются в настройке.
Пример из вашего вопроса, я думаю, приграничный кейс. Моя кишка инстинкт должен был бы создать два совершенно отдельных взглядов и запустить их в следующем псевдокоде:
editableView = { //definition }}
disabledView = { //definition }}
if (newModel)
editableView.render()
else
disabledView.render()
Это мой инстинкт кишки, потому что моя ставка является то, что есть и другие различия между видами, чем ли входы являются редактируемыми , Даже если их нет, вы можете обнаружить через несколько месяцев, что ваши потребности изменились, и что вы хотите внести некоторые изменения. Подход, который я предлагаю, позволяет вам вносить эти изменения прямо в соответствующий View и не беспокоиться о том, чтобы вывести их из системы в одном представлении и решить, принадлежит ли эта логика шаблону или представлению.
Если бы вы были абсолютно уверены, что только разница между этими двумя мнениями собирался быть, были ли редактируемые входы, и что ваши потребности не изменится в будущем, то возможно вы бы хотите подумать о том, чтобы сделать их с одинаковым представлением. Если это так, я рекомендую вам поместить логику в javascript, а не в шаблон, по причинам, которые вы определили. Но, как я уже сказал, ваш пример действительно является пограничным случаем, и в большинстве случаев, я думаю, вы обнаружите, что сокращение вашей области обзора действительно поможет вам увидеть, к чему принадлежит ваша «логика шаблонов».
ПРИМЕЧАНИЕ: В этом ответе я много говорил о марионетке, но я также упомянул Чаплина как еще один вариант выше. У меня нет большого опыта работы с Чаплином, но вы можете рассмотреть его как альтернативу марионетке.
, если я вас были я бы на месте ввода в отдельном окне (InputView) с Params типа ({инвалидная: правда, требуется: верно, тип : 'text'}) - это даст вам возможность сохранить единственный шаблон без ссылок на контекст. В любом представлении u используйте ввод, вам просто нужно отобразить это представление как дочерний с параметрами 'var inputView = (новый InputView ({el: $ el.find ('. Input-wrap'), отключен:! View.model.isNew()})).render(); 'Таким образом, этот подход будет отделять логику ввода от родительского представления и будет содержать инкапсулированные и повторно используемые Inputview – Evgeniy