Нокаутируемый с помощью 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. Когда эти компоненты отсутствуют, это вызывает странное поведение.

Я оставляю здесь ответ на случай, если он пригодится кому-то еще.

Другие вопросы по тегам