2

我刚刚开始了一个新的Hot Towel SPA项目,但在使用 ViewModel 敲除进行绑定时遇到了麻烦。

我的视图模型如下所示:

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<ARGUMENTS.LENGTH) [...])

如果我将绑定更改为“data-bind="text:title()”,它会起作用,但我意识到这不会绑定可观察对象,只会绑定值。因此,当使用此类绑定进行表单时,它不会t 更新 observable,我无法保存该值。

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

4

3 回答 3

4

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

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

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

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

所有这一切都是设计使然

您可以将这些服务填充到 require 的等效 IoC 容器中。如果你这样做了,require 会找到 'ko' 并且你的函数会起作用。您可以从这里开始了解这一点。我已经做到了。这还不错。

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

选择其他方式并不难。只要学会在你的main.js中填充 require 就可以了。

于 2013-02-27T17:45:59.090 回答
3

在 Durandal 开发人员的帮助下发现了这个问题:https ://groups.google.com/forum/#!topic/durandaljs/Ku1gwuvqPQQ

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

于 2013-02-26T17:50:16.660 回答
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;
        }
    };
});
于 2013-02-26T16:08:00.233 回答