Нокаутируемый с помощью Durandal compose
Я пытаюсь создать представление, которое содержит динамический набор виджетов (не фактические Durandal виджеты) внутри него. Каждый виджет - это просто стандартный модуль, который будет иметь свое собственное поведение и рендеринг, и пользователь должен иметь возможность перетаскивать и реорганизовывать их, а также добавлять дополнительные или удалять их.
Текущая структура файла следующая:
- ViewModels
- home.js
- widgetA.js
- widgetB.js
- Просмотры
- home.html
- widgetA.html
- widgetB.html
Home viewModel содержит observableArray
Вызывается виджетами, который содержит имя видовой модели виджета в виде строки:
var vm = {
activate: activate,
someContext: ko.observable()
widgets: ko.observableArray()
};
Проблема № 1:
Если я использую компоновочное связывание в foreach, все работает как положено, например:
<div data-bind="foreach: widgets">
<div data-bind="compose: $data"></div>
</div>
Однако, если я изменю с foreach
в sortable
кажется, что $data больше не ссылается на виджет, и текущее представление домашнего контейнера обрабатывается бесконечно много раз.
ОБНОВЛЕНИЕ: Чтобы увидеть, действительно ли $data менялся, я сделал следующее:
<div data-bind="foreach: widgets">
<div data-bind="text: JSON.stringify($data)"></div>
</div>
И действительно, при использовании foreach результатом было имя viewModel виджета, но когда использовалась сортируемая, оно содержало фактическую viewModel для дома.
Проблема № 2:
Мне нужно отправить свойство someContext viewModel виджету, так как для инициализации ему нужна эта информация. Я попытался с помощью ActivationData, но в сообщении об ошибке указано, что объект был неопределен:
<div data-bind="foreach: widgets">
<div data-bind="compose: { model: $data, activationData: someContext }"></div>
</div>
Я надеялся избежать необходимости специально объявлять зависимости для каждого типа виджета и создавать их экземпляры в домашней viewModel, используя преимущества композиции таким образом, однако я могу ошибаться, пытаясь использовать этот маршрут.
Я основал подход на комментариях, найденных в этой теме: https://groups.google.com/forum/
Я довольно новичок в нокауте + Дюрандале, так что все отзывы очень ценятся.
1 ответ
На самом деле я только что узнал, что это была смущающая ошибка с моей стороны. Я забыл включить jqueryUI и knockout-sortable в комплект js. Когда эти компоненты отсутствуют, это вызывает странное поведение.
Я оставляю здесь ответ на случай, если он пригодится кому-то еще.