使用Hot Towel应用程序中的Knockout绑定可观察对象

时间:2013-02-26 15:38:09

标签: binding knockout.js hottowel durandal

我刚刚开始了一个新的Hot Towel SPA项目,我无法通过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>

但标题总是最终变成垃圾(即函数的代码,就像使用调试器时一样:FUNCTION D(){IF(0&lt; ARGUMENTS.LENGTH)[...])

如果我将绑定更改为“data-bind =”text:title()“,它可以工作,但我意识到这不会绑定observable,只会绑定值。所以在使用这些绑定进行表单时,它不会更新observable,我无法保存该值。

我发现似乎使用与我完全相同的代码的示例,但我不明白为什么它不起作用。

3 个答案:

答案 0 :(得分:4)

克里斯蒂安 - 你自己想出来了。我会详细说明。

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

你会看到所有第三方脚本 - 包括淘汰赛脚本 - 都被加载到了......之后。这意味着没有任何第三方脚本可以检测到即将使用的require。因此,它们将自己加载到全局命名空间(窗口)中。

当RequireJS出现时,它也不知道任何这些服务。因此,当你要求'ko'作为依赖关系时,它会返回null ...因为如果你在函数开始处设置断点,你可以自己看看。

所有这一切都是设计

您可以将这些服务填充到require等效的IoC容器中。如果你这样做,require会找到'ko'并且你的功能会起作用。您可以开始了解此here。我做到了这不是太糟糕。

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

否则选择并不难。只需在 main.js 中学习shim require,即可开展业务。

答案 1 :(得分:3)

问题是在Durandal开发人员的帮助下找到的:https://groups.google.com/forum/#!topic/durandaljs/Ku1gwuvqPQQ

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

答案 2 :(得分:0)

你可以尝试这样的事情:

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;
        }
    };
});