【问题标题】:Update the contents of a jquery UI dialog using knockout.js使用 knockout.js 更新 jquery UI 对话框的内容
【发布时间】:2012-07-16 20:20:34
【问题描述】:

我正在使用最新版本的 knockout.js 和 jquery。我正在尝试创建一个 jquery 对话框,只要特定的 ko.observable 具有值,该对话框就会打开和关闭。我的实现基于这个 jsfiddle 中的代码 http://jsfiddle.net/rniemeyer/WpnTU/,我在这个 Knockout.js 论坛 https://groups.google.com/d/msg/knockoutjs/XIaQMNHjy7Q/BpfDU5inKVQJ 中找到了它。

但是,这种方法只有在我包含现已弃用的 jquery-tmpl.js 插件(版本 1.0.0pre)时才有效。我将我的问题提炼为两个 jsfiddle,一个工作版本 (http://jsfiddle.net/LhEnV/29/) 和一个损坏的版本 (http://jsfiddle.net/gygh3/1/)。唯一的区别是 jquery-tmpl.js 不包含在第二个版本中。

问题的根源在于,当我第一次加载页面时,对话框及其内容所依赖的 observable 没有设置。因此,模板绑定的属性不可用,从而导致错误。在淘汰赛之前包括 jquery-tmpl 可以解决问题,所以我假设淘汰赛模板引擎会在 jquery-tmpl 可用时改变它的行为。但是,我不想依赖已弃用的插件。

有没有更好的方法将 jquery UI 对话框及其内容绑定到 ViewModel?

【问题讨论】:

  • 您是否尝试过显式订阅 observables 更改,因此您将显示/隐藏对话框的代码放在“订阅”函数中? knockoutjs.com/documentation/observables.html 请参阅“显式订阅 observables”部分。
  • 没有。我想将我的 DOM 操作代码保留在自定义绑定中,因为这似乎是淘汰赛的最佳实践。 Serjio 的回答正是我所缺少的。

标签: javascript jquery jquery-ui knockout.js


【解决方案1】:

只要改变这个:

<script id="newDialogTmpl" type="text/html">
    Add <span data-bind="text: displayName"></span>?
</script>
​

至于:

<script id="newDialogTmpl" type="text/html">
    <!-- ko if: $data -->
    Add <span data-bind="text: displayName"></span>?
    <!-- /ko -->
</script>

第一次你的 newThing 属性等于 null 所以它是触发引用错误。您应该检查 $data 是否不为空,如果为空则渲染模板 - 什么也不做

【讨论】:

  • 啊,就是这样!很简单。您的解决方案在我的 jsfiddle 中运行,更重要的是它在我的实际代码中解决了这个问题。感谢您的快速响应!
  • 另一个提示是,您实际上可以将“if”作为模板绑定的选项,例如:template: { template: { name: 'newDialogTmpl', 'if': newThing, data: newThing },然后您可以将其从模板中删除。 jQuery 模板引擎比原生引擎更能容忍数据为空。我把if 放在引号中,因为上次我检查了旧的IE 版本不喜欢那个级别的KO 解析中的if 关键字。
  • @RPNiemeyer 模板绑定中的“if”选项是否记录在任何地方?我在online documentation 中没有看到它。我对淘汰赛很陌生。
  • 看起来我们没有。我会处理的。现在,我的这篇文章帮助解释了它为什么存在:knockmeout.net/2011/09/…
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2014-08-18
相关资源
最近更新 更多