Ошибка загрузки модели представления компонентов с выбыванием с использованием requireJS

Я работаю с новой функциональностью компонентов knockout 3.2 и пытаюсь загрузить компоненты с помощью requireJS. Однако у меня странная проблема. В принципе, когда я жестко кодирую модель представления в функции регистра, все работает нормально. Когда я пытаюсь загрузить точно такую ​​же модель представления с помощью requireJS, она работает неправильно.

Вот пример HTML-кода для загрузки компонента:

<div data-bind="component: { name: 'test'}"></div>

Вот HTML-код в шаблоне, который будет загружать этот компонент:

<a href="#" data-bind="click: addNew">add</a>
<span data-bind="visible: Adding">test</span>

Когда я пишу свою функцию регистрации, как показано ниже, все работает как положено (это означает, что при загрузке текст "test" не отображается, пока пользователь не нажмет ссылку "add"):

ko.components.register('test',
{
    template: { require: 'text!path/theTemplateFromAbove.html' },
    viewModel:
        function() {
            var self = this;
            self.Adding = ko.observable(false);

             self.addNew = function() {
                 self.Adding(true);
             }
        }
 });

Но если я попытаюсь изменить это, чтобы использовать requireJS для загрузки модели представления, это не сработает. "Тестовый" текст отображается сразу, а пользователь не нажимает на ссылку "Добавить". Наблюдаемые на модели представления каким-то образом запутываются.

Вот содержимое файла скрипта (обратите внимание, что модель представления такая же):

define(["knockout"], function (ko) {

    function viewModel() {  
        var self = this;
        self.Adding = ko.observable(false);

        self.addNew = function () {
            self.Adding(true);
        }
    };

    return viewModel;
});

И функция регистрации теперь будет выглядеть так:

ko.components.register('test',
{
    template: { require: 'text!path/theTemplateFromAbove.html' },
    viewModel: { require: 'path/fileForMyTemplate' }
});

При отладке проблемы я добавил проверку в функцию resolViewModel из knockout-3.2.0. После того, как он вызывает новый viewModelConfig(params), я проверяю, является ли "Добавление" наблюдаемым на объекте. Когда модель представления жестко закодирована в функции регистра, она возвращает true. Когда я использую requireJS для загрузки модели представления, она возвращает false.

Любые идеи о том, что я делаю здесь не так?

1 ответ

Решение

[скопировано из комментария как ответ, чтобы избежать путаницы]

Твой ko.components.register строка, заключенная в модуль requirejs?

Я подозреваю, что вы загружаете файл JavaScript knockout.js до require.js файл, а затем вы получите доступ к глобальной ko переменная, чтобы сделать ko.components.register который отличается ko объект из загруженного require.js,

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