Durandal 给出 "Cannot read property 'nodeType' of null" 错误

Durandal gives "Cannot read property 'nodeType' of null" error

一直在玩 Durandal 2.1.0,但似乎无法在 运行ning 上得到一个例子。当我 运行 它在 Chrome 中时,我收到错误 "Cannot read property 'nodeType' of null".

文件夹结构为: -视图模型

|-vm1.js

-脚本

|-杜兰德尔...

-观看次数

|-vm1.html

-Index.html

index.html

<html>
<head>
    <title></title>
    <script src="Scripts/knockout-3.1.0.js"></script>
    <script src="Scripts/jquery-1.9.1.js"></script>
</head>
<body>
<script src="Scripts/require.js" data-main="Scripts\main"></script>
</body>
</html>

main.js

requirejs.config({
paths: {
    'text': 'Scripts/text',
    'durandal': 'Scripts/durandal',
    'plugins': 'Scripts/durandal/plugins',
    'viewLocator': 'durandal/viewLocator',
}
});

define('jquery', function () { return jQuery; });
define('knockout', ko);

define(function (require) {
    var system = require('durandal/system'),
        app = require('durandal/app'),
        router = require('plugins/router');

    system.debug(true);

    app.start().then(function () {
    app.setRoot('viewmodels/vm1');
});
});

vm1.js:

define(['plugins/router'], function (router) {
    return {
        router: router,
        activate: function () {
            //This line never fires
            alert();
        }
    }
});

PS:安装了nuget。假设任何 JS 错误都是拼写错误,脚本本身是可以的。我尝试了各种方式来移动脚本加载的顺序,使用 viewLocator 手动定义路径。似乎与我在 Durandal 网站上看到的示例完全一致。

感谢任何帮助。

除非您直接指定路径,或使用自定义 viewLocator,否则您需要放置 views 目录和 viewmodels 目录在同一水平上。换句话说,他们需要是树上的兄弟姐妹。

看看我们在 main.js 中的主要入口点。我已经删除了不相关的位:

function (system, app, viewLocator, bindings, extenders, validations) {
    //>>excludeStart("build", true);
    system.debug(true);
    //>>excludeEnd("build");        

    //Initialize KnockoutJS customizations
    bindings.init();
    extenders.init();        

    app.title = 'Some Application';

    app.configurePlugins({
        router: true,
        dialog: true,
        widget: true
    });

    app.start().then(function() {
        //Replace 'viewmodels' in the moduleId with 'views' to locate the view.
        //Look for partial views in a 'views' folder in the root.
        viewLocator.useConvention();

        //Show the app by setting the root view model for our application with a transition.
        app.setRoot('viewmodels/shell');
    });
});

我没看到你在哪里调用 viewLocator.useConvention(),或者自定义 viewLocator

此外,您的 App 目录在哪里?我们有以下(在许多其他目录中):

App

views

viewmodels

App 位于服务器上我们 Web 项目的顶层。

所以,我玩 Durandal/ Knockout 已经有一段时间了,一开始我遇到了类似的问题。如果您已开始在您的应用程序中使用 Knockout,则所有其他答案都是有用且更相关的。但是由于我什至在使用 Knockout 之前就遇到了这个错误,所以我对我的代码进行了逐行分解。

事实证明,我没有在 index.html 文件中添加 div#applicationHost 元素。而已。简单地添加这个就解决了我的问题。

index.html

<body>
  <div id="applicationHost">
    ...
  </div>
</body>

现在,并非绝对需要始终使用此 ID 的 div,但是您将不得不手动编写您的应用程序。您可以在 this discussion here.

上阅读更多内容