为什么有时候applyBindings不起作用?

时间:2013-09-06 13:33:29

标签: javascript jquery knockout.js

我有一个简单的html页面,我在客户端使用jquery,jqueryui和knockout以及来自Web服务的一些数据动态创建。

我用这样的代码动态创建一些标签:

document.getElementById("myDiv").innerHTML = dynamicTags;

然后我打电话给ko.applyBindings:

ko.applyBindings(Datas, document.getElementById("myDiv"));

这根本行不通;在chrome调试器中没有引发异常。

我用这段代码做了一些随机测试:

setTimeout(function () {
    ko.applyBindings(Datas, document.getElementById("myDiv"));
}, 3000);

一切都很完美。

为什么会这样?我同时绑定了值和样式。

点击按钮调用此代码!

2 个答案:

答案 0 :(得分:3)

确保将绑定应用于DOM末尾的脚本或已加载DOM的脚本中。在jQuery中,可以通过以下方式完成:

$(document).ready(function() {
    // apply bindings here
});

否则,在将HTML完全加载到内存甚至下载之前,可能会调用内联脚本。

答案 1 :(得分:0)

有可能你的代码没有被执行(或被绑定执行),因为它可以withwithout点击我眼中的按钮。

function goLetsGo(){
    var html = '<fieldset>'
        + '<legend data-bind="text:fullname"></legend>'
        + '<p>First Name: <span data-bind="text:firstname"></p>'
        + '<p>Last Name: <span data-bind="text:lastname"></p>'
        + '<p>Age: <span data-bind="text:age"></p>'
    + '</fieldset>';

    document.getElementById('myDiv').innerHTML = html;

    var vm = function(){
        this.firstname = ko.observable('Brad');
        this.lastname = ko.observable('Christie');
        this.fullname = ko.computed(function(){
            return this.firstname() + ' ' + this.lastname();
        }, this);
        this.age = 27;
    };
    ko.applyBindings(new vm(), document.getElementById('myDiv'));
}

结果:

<fieldset>
  <legend data-bind="text:fullname">Brad Christie</legend>
  <p>First Name: <span data-bind="text:firstname">Brad</span></p>
  <p>Last Name: <span data-bind="text:lastname">Christie</span></p>
  <p>Age: <span data-bind="text:age">27</span></p>
</fieldset>

检查以确保调用代码。此外,确认您没有任何绑定错误(例如引用不存在的属性或尝试使用未声明的绑定)。