【问题标题】:Require JS with Knockout components is looking for js file in incorrect pathRequire JS with Knockout components 在不正确的路径中寻找 js 文件
【发布时间】:2016-08-14 00:54:07
【问题描述】:

我试图通过构建淘汰组件来了解 require js 的工作原理。我已经构建了 2 个单独的淘汰组件进行测试。我的目录结构如下:

- App
  |_ Components
     |_ Like-Widget
        |_like-widget.js
        |_like-widget.html
     |_ sign-in
        |_sign-in.js
        |_sing-in.html
     |_ startup.js
- Scripts
    |_ knockout.js
    |_ knockout-es5.js
    |_ app.js

我在 app.js 文件中配置了 require.js 如下

    require.config({
    paths: {
        ko: "/Scripts/knockout-3.4.0",
        kox: "/Scripts/knockout-es5",
        jquery: "/Scripts/jquery-1.10.2.min",
        text: "/Scripts/text"
    },
    shim: {
        "kox": {
            deps:["ko"]
        }
    },
    baseUrl: "/App/Components"
});

require(["/App/Components/startup.js"]);

这是我的 startup.js 文件

define(['ko'], function (ko) {
ko.components.register('like-widget', { require: 'like-widget/like-widget' });
ko.components.register('sign-in', { require: 'sign-in/sign-in' });
ko.applyBindings();

});

我的 like-widget.js 和 sign-in.js 文件几乎相同,用于测试目的

define(["kox", "text!like-widget/like-widget.html"], function (ko, template) {

function myViewModel(params) {
    var self = this;
    self.personName = 'Bob';
    self.personAge = 23;
    ko.track(this);
};

return {
    viewModel: myViewModel,
    template: template
};

});

define(["kox", "text!sign-in/sign-in.html"], function (ko, template) {

function signInViewModel(params) {
    var self = this;
    self.userName = 'User 1';
    ko.track(this);
};

return {
    viewModel: signInViewModel,
    template: template
};

});

这就是我在我的 html 页面中引用 require.js 的方式

 <script type='text/javascript' data-main="/Scripts/app.js" src="~/Scripts/require.js"></script>

问题是我的like-widget 组件工作正常,但是当我尝试使用我的登录组件时,我收到了一个错误

获取http://localhost:65182/App/Components/knockout.js

未捕获的错误:“knockout”的脚本错误,需要:kox http://requirejs.org/docs/errors.html#scripterror

从错误看来,requirejs 试图从错误的位置加载敲除,我的 knockout.js 不在组件目录中,而是在脚本目录中。我无法理解的是它如何正确加载like-widget 组件?

我是 requirejs 的新手,所以我假设我犯了一些幼稚的错误,你能指出来吗?

【问题讨论】:

    标签: javascript knockout.js requirejs knockout-es5-plugin


    【解决方案1】:

    如果你查看knockout-es5插件的源代码,你会发现它需要将knockout路径设置为'knockout',而不是'ko'。

    } else if (typeof define === 'function' && define.amd) {
          define(['knockout'], function(koModule) {
            ko = koModule;
            attachToKo(koModule);
            weakMapFactory = function() { return new global.WeakMap(); };
            return koModule;
          });
    }
    

    如果您更改了淘汰赛所需的配置路径

    require.config({
        paths: {
            knockout: "/Scripts/knockout-3.4.0",
            // instead of ko: "/Scripts/knockout-3.4.0" 
        }
    

    它应该工作。您还可以删除敲除 es5(在您的示例中为 kox)的 shim,因为它不需要。

    【讨论】:

    • 谢谢,现在可以完美运行了。从来没有想过挖掘插件文件:)
    猜你喜欢
    • 2017-03-25
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2019-04-08
    • 2015-08-15
    相关资源
    最近更新 更多