Knockout Components Uses требуют, но загрузчик AMD отсутствует

В настоящее время я работаю над проектом Durandal и исследую использование Knockout Components в своем приложении. Я использую Gulp и плагин gulp-durandal и настроил его на использование миндаля.

Я столкнулся с проблемой, когда я получаю следующую ошибку при переходе на одну из моих страниц, которая использует недавно зарегистрированные компоненты:

компонент: функция () { return componentBindingValue; }» Сообщение: Компонент «myComponent»: использует требование, но загрузчик AMD отсутствует

В надежде предоставить как можно больше информации, вот gulpfile, который я сейчас использую.

var gulp = require('gulp');
var durandal = require('gulp-durandal');

gulp.task('durandal', function() {
    durandal({
        baseDir: 'app',
        main: 'main.js',
        output: 'main-built.js',
        almond: true,
        minify: true,
        rjsConfigAdapter: function (rjsConfig) {
            rjsConfig.paths = {
                'text': '../Scripts/text',
                'durandal': '../Scripts/durandal',
                'plugins': '../Scripts/durandal/plugins',
                'transitions': '../Scripts/durandal/transitions',
                'dataservice': 'domain/dataservice'
            };

            return rjsConfig;
        }
    }).pipe(gulp.dest('build'));
});


person James Chadwick    schedule 04.02.2015    source источник
comment
Если вы установите миндаль: false, это сработает?   -  person Frank    schedule 05.02.2015
comment
К сожалению нет. Если я изменю скрипт на миндаль: false, то при попытке запустить main.js я получаю сообщение об ошибке: «Uncaught ReferenceError: определение не определено».   -  person James Chadwick    schedule 05.02.2015
comment
что ж, попробовать стоило, похоже, сообщение об ошибке, которое вы получаете, взято из этого код . Я бы попробовал использовать отладочную версию нокаута и поставить здесь точку останова, а затем проследить трассировку стека и посмотреть, не обнаружит ли что-нибудь еще. Если вы не настроены на выбивающие компоненты, вы также можете попробовать использовать встроенный поддержка виджетов в durandal, очень похоже на компоненты ko   -  person Frank    schedule 05.02.2015
comment
@James, вы нашли какое-нибудь решение для этого, потому что я тоже столкнулся с той же проблемой?   -  person Sivanraj M    schedule 10.02.2015
comment
@SivanrajM Нет, не видел. Я вижу, что вы также прокомментировали проблему, которую я зарегистрировал в Github. Я заметил эту проблему и в версии 3.2, и в то время создавал свое приложение с использованием Weyland. Поскольку Weyland был прекращен, решил перейти на Gulp. Обоснованное предположение заставило бы меня поверить, что Алмонд и Нокаут не очень хорошо играют вместе.   -  person James Chadwick    schedule 10.02.2015


Ответы (2)


Задача Durandal Gulp вызывает r.js с параметром wrap, настроенным для инкапсуляции кода вашего приложения в IFFE с исходным кодом Almond. К сожалению, реализации Almond require, requirejs и define объединяются внутри и не добавляются в глобальную область окна, как ожидает Knockout.

Вы можете манипулировать параметром переноса в rjsConfigAdapter, чтобы удалить оболочки IFFE, или просто добавить require/define к объекту окна первым делом в коде приложения, чтобы обойти это.

Ex.

requirejs.config(config);
window.require = require;
window.requirejs = requirejs;
window.define = define;
person Nuclear Wessel    schedule 11.02.2015

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

Оказывается, это также может быть состоянием гонки. Мне пришлось поместить ko.applyBindings внутри обратного вызова document.ready, и все заработало.

person cscott530    schedule 06.10.2016