在特定上下文中应用knockout绑定

时间:2013-10-09 09:35:04

标签: javascript requirejs knockout-2.0

我在Knockout中也是新手。现在我正在尝试将我的Knockout视图模型集成到Reuire.js架构中。

我有5个js文件:

  • /scripts/require.js
  • /scripts/jquery-2.0.3.js
  • /scripts/knockout-2.2.0.js
  • /scripts/app.js
  • /scripts/ko-model/MyViewModel.js

这就是我从index.html调用require.js的方法:

<script data-main="/scripts/app" src="/scripts/require.js"></script>

这是入口点脚本app.js:

require.config({
    baseUrl: "/scripts",
    paths: {
        "jquery": "jquery-2.0.3",
        "knockout": "knockout-2.2.0",
        "MyViewModel": "./ko-model/MyViewModel"
    }
});

require([
    "jquery",
    "knockout",
    "MyViewModel"
],
    function ($, ko, MyViewModel) {
        // LOGIC:
        $(function () {
            ko.applyBindings(
                new MyViewModel(),
                $("#myId")
            );
        });        
    });

这是MyViewModel.js模块:

define(
    'MyViewModel',
    ["knockout"],
    function (ko) {
        return function MyViewModel() {
            // MyViewModel implementation
            ...
        };
    });

这对我来说很好。但

正如你在app.js中看到的那样,我有:

function ($, ko, MyViewModel) {
    // LOGIC:
    $(function () {
        ko.applyBindings(
            new MyViewModel(),
            $("#myId")
        );
    });
}

我不喜欢这个。我宁愿不要在这里使用jQuery并以某种方式指定knockout上下文:

function ($, ko, MyViewModel) {
    // LOGIC:
    ko.applyBindings(
        new MyViewModel(),
        document.getElementById("myId")
    );
}

但在这种情况下,敲除绑定不起作用。似乎 document.getElementById(“myId”) 在这里不起作用。我不知道为什么。 (我最好的猜测是,当ko.applyBindings()调用时,文档尚未加载。

因此我有下一个问题:

如何在LOGIC部分中使用jQuery进行转义,但是仍然指定了敲除上下文?

我希望有任何改进我的代码的建议。

1 个答案:

答案 0 :(得分:1)

是的,它无法找到id,因为很可能文档还没有完成加载。如果<script>位于<head>,则很可能会出现此问题。您需要友好的解决方案是domReady plugin。来自文档:

require(["jquery", "knockout", "MyViewModel", "domReady"],
function($, ko, MyViewModel, domReady) {
    domReady(function () {
        // your code here, document is initialized
    });
});