Binding 在热毛巾应用程序中可通过击倒观察到绑定

Binding 在热毛巾应用程序中可通过击倒观察到绑定,binding,knockout.js,hottowel,durandal,Binding,Knockout.js,Hottowel,Durandal,我刚刚开始了一个新项目,我在使用ViewModel中的knockout进行绑定时遇到了问题 我的视图模型如下所示: define([ "services/logger", "knockout" ], function (logger, ko) { var title = ko.observable("Partners"); return { title: title, activate: function () {

我刚刚开始了一个新项目,我在使用ViewModel中的knockout进行绑定时遇到了问题

我的视图模型如下所示:

define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = ko.observable("Partners");


    return {
        title: title,
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});
<section class="row-fluid">
    <div class="span10" id="admin-content">
        <h2 class="page-title" data-bind="text: title"></h2>
    </div>
</section>
define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = "Partners";


    return {
        title: ko.observable(title),
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});
视图如下所示:

define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = ko.observable("Partners");


    return {
        title: title,
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});
<section class="row-fluid">
    <div class="span10" id="admin-content">
        <h2 class="page-title" data-bind="text: title"></h2>
    </div>
</section>
define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = "Partners";


    return {
        title: ko.observable(title),
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});


但是标题总是以垃圾结尾(例如,函数的代码,比如在使用调试器时:function D(){IF(0你能试试这样的东西吗:

define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = ko.observable("Partners");


    return {
        title: title,
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});
<section class="row-fluid">
    <div class="span10" id="admin-content">
        <h2 class="page-title" data-bind="text: title"></h2>
    </div>
</section>
define([
    "services/logger",
    "knockout"
],
function (logger, ko) {
    var title = "Partners";


    return {
        title: ko.observable(title),
        activate: function () {
            var that = this;
            logger.log("Partners view activated", null, "admin.partners", false);

            return true;
        }
    };
});

在Durandal开发人员的帮助下发现了此问题:


似乎使用AMD包含敲除是个问题。我不知道具体细节,但这可能与Durandal使用全局ko变量有关,而我的视图模型使用ko变量,这是另一个变量,因为RequireJS创建了自己的实例。

Christian-你自己解决了。我会精心设计

查看App_Start/bundleconfig.cs中定义的供应商包,然后查看index.cshtml底部附近的脚本加载(~第29行)

您将看到,所有第三方脚本(包括淘汰脚本)都在Require之前加载到一起。这意味着没有任何第三方脚本可以检测到Require的即将使用。因此,它们将自己加载到全局命名空间(窗口)中

当RequireJS出现时,它也不知道这些服务中的任何一个。因此,当您请求将“ko”作为依赖项时,它返回
null
…如果您将断点放在函数开始的位置,您可以看到这一点

所有这些都是设计的

你可以将这些服务填充到require的IoC容器中。如果你这样做了,require会找到“ko”,你的函数就会起作用。你可以开始了解这一点。我已经做了。还不错

但是,我们中的一些人已经在这些水域中游泳了一段时间,他们认为这是一个太多的PITA。因此,我们遵循Durandal的简化建议:“在Require之外加载一些第三方库,让它们在全局名称空间中乱扔;更多的应用程序文件应该在Require中。”


选择其他方式并不难。只要学会在main.js中填充require,你就可以开始工作。

我刚刚确认,做一个ko.applyBindings({test:ko.observable('test')},$(“#test”)[0]);在没有括号的情况下与绑定一起工作,因此它似乎确实与Durandal有关。您在哪里添加此
ko.applyBindings(…)
语句?是否在
activate
函数下的[viewmodel].js中?Blaise,请查看解决我问题的此问题的答案。相同的问题。我通过添加对ViewModel使用“setView”方法,并手动应用绑定,但这似乎只适用于可观察数组,而不适用于可观察数组。标记为答案是因为它更简洁,并提出了垫片选项。我个人喜欢乱丢全局名称空间,这一点我没意见。