2

我目前正在从事 Durandal 项目并研究在我的应用程序中使用Knockout 组件。我正在使用 Gulp 和gulp-durandal插件进行构建,并将其配置为使用 almond。

我遇到了一个问题,在导航到使用新注册组件的页面之一时收到以下错误:

组件:函数(){返回组件绑定值;}" 消息:组件 'myComponent':使用 require,但不存在 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'));
});

4

2 回答 2

2

Durandal Gulp 任务正在调用 r.js,并使用配置的wrap参数将应用程序代码封装在带有 Almond 源的 IFFE 中。不幸的是,Almond 的require、requirejs 和 define实现被捆绑在内部,并没有像 Knockout 所期望的那样被添加到全局窗口范围中。

您可以操作 rjsConfigAdapter 中的 wrap 参数以删除IFFE包装器,或者只需在应用程序代码中首先将 require/define 添加到窗口对象以解决此问题。

前任。

requirejs.config(config);
window.require = require;
window.requirejs = requirejs;
window.define = define;
于 2015-02-11T21:43:34.547 回答
-1

我也遇到过这个问题,但我有一个更简单的前端堆栈,而且我只在一个页面上看到它,即使我在我的网站的几个地方使用了该组件。

事实证明,它也可能是一种竞争条件。我不得不把我ko.applyBindings的回调放在里面document.ready,一切正常。

于 2016-10-06T14:44:50.253 回答