在knockout.js中的ko.applyBindings之后向模型添加可观察属性

时间:2012-04-22 18:38:16

标签: javascript knockout.js

例如

function Model(){};
var model = new Model();
ko.applyBinding(model);

model.name = ko.observable('john');

我知道代码不起作用但可以使其工作吗?

5 个答案:

答案 0 :(得分:2)

我能够通过使用cleanNode然后重新应用绑定来实现此目的。

function Model(){};
var model = new Model();
ko.applyBindings(model);

model.name = ko.observable('john');

var myDiv = $('#myDiv')[0];
ko.cleanNode(myDiv);
ko.applyBindings(model, myDiv);

<div id="myDiv">
    <span data-bind="text: name"></span>
</div>

答案 1 :(得分:1)

可能的解决方案是绑定到局部视图,例如:

<div id="viewOne">
  <input data-bind="value: name" />
</div>

<div id="viewTwo">
  <input data-bind="value: name" />
</div>

<script type="text/javascript">
  var viewModelA = {
     name: ko.observable("John")
  };

  var viewModelB = {
     name: ko.observable("Doe")
  };

  ko.applyBindings(viewModelA, document.getElementById("viewOne"));
  ko.applyBindings(viewModelB, document.getElementById("viewTwo"));
</script>

因此,在您的情况下,添加新属性后,您只能在需要新数据的视图部分再次应用绑定。

答案 2 :(得分:0)

您可能需要再次致电ko.applyBindings。我不确定它是否会起作用。如果没有,您可能需要查看KnockoutJS代码以找出applyBindings的作用,然后计算出您需要调用的函数以部分应用于新绑定。

答案 3 :(得分:0)

这应该能够让applyBindings函数只添加一个div。目前正在我自己的应用程序中尝试它。到目前为止运气不太好。不知道它会如何对您的应用程序做出反应。

ko.applyBindings(model, document.getElementById('#yourdiv'));

仅使用模型调用applyBindings来绑定它以在对象上创建其他绑定。不建议这样做。

function Model(){};
var model = new Model();
model.name = ko.observable('john');
ko.applyBindings(model);

model.street = ko.observable('stationstreet');
ko.applyBindings(model);

后者会在街道对象上创建单个绑定,但是会在名称对象上创建第二个绑定。

答案 4 :(得分:-2)

无需再次调用ko.applyBindings。很可能你的绑定代码是在你的html代码之前调用的。如果您将applyBinding移动到文档就绪,一切都会好的!

对于jquery:

$(function () {
    ko.applyBindings(viewModel);
});