调用ko.applyBindings后,向Knockout viewmodel添加新属性

时间:2015-02-20 22:39:35

标签: javascript jquery knockout.js webforms

在(webforms)页面中,我有一个按钮,可以打开动态加载的jqueryui dialogue 问题是我想让这个对话成为自己的淘汰视图模型的主人,但是视图模型已经在主页面中设置了。

我认为在调用ko.applyBindings后, 可能会在视图模型中添加新属性。
相反,我应该研究另一种设计。但是哪个?

  • 申请bindings to different parts of the DOM需要我进行一些重大设计,我希望现在可以避免。
  • 将所有的dialoge绑定作为键值列表是可能的,但不是很优雅恕我直言。然后主页只需要添加vm.dialogueKeyvalueCollection
  • 我现在可能的解决方案是让主窗体添加对话框的属性vm.dialogue.userName() vm.dialogue.searchResult(),然后我的html控件won't bind as they are created after applyBindings is called。目前的解决方案是再次调用ApplyBindingsko.applyBindings(vm, $('#dialog-form')[0]);添加HTML。我相信(并且仍然有点)为不同的DOM元素调用applyBindings,不能嵌套在另一个DOM元素中。绑定到动态HTML的注释为here和jsfiddled here

2 个答案:

答案 0 :(得分:2)

我使用嵌套视图模型进行了大量编写,通常用于创建对话模式。请参阅here以获得完整的答案。

但是,尝试使用with绑定可能会更简单。您可以在viewmodel上创建dialogueViewmodel可观察属性。

当您准备好显示对话时,只需用一个或多个可观察的键填充它,例如

this.dialogueViewmodel({
  markup: ko.observable("<h1>Kittens!</h1>")
});

并将其包装在with绑定中:

<!-- ko with: dialogueViewmodel -->
  <div id="dialog" title="Basic dialog" data-bind="html: markup">
  </div>
<!-- /ko -->

只要dialogueViewmodelnull,就不会绑定和渲染任何内容。只有在添加对话数据时才会发生这种情况 - 无需再次使用applyBindings

但是,您可能必须使用jQueryUI.dialogue编写自己的绑定接口。

第三个选项:我已经编写了一个modal library,附带一个开箱即用的Knockout绑定。这是一个JSfiddle demo。如果你没有设置jQueryUI,那可能是另一种选择;虽然文档并不完美,但我很乐意以任何方式帮助您并在此过程中修复文档。

答案 1 :(得分:0)

你可以ko.applyBindingsToNode函数绑定附加的html。

ko.applyBindingsToNode(appendedelement,{ binding options})

希望这会对你有所帮助。