如何强制视图刷新而不让它从可观察对象自动触发?
Posted
技术标签:
【中文标题】如何强制视图刷新而不让它从可观察对象自动触发?【英文标题】:How to force a view refresh without having it trigger automatically from an observable? 【发布时间】:2012-01-22 04:05:33 【问题描述】:注意:这主要是为了调试和理解 KnockoutJS。
有没有办法明确请求 Knockout 从(已经绑定的)视图模型刷新视图?我正在寻找类似的东西:
ko.refreshView();
我知道这不是 Knockout 的预期用途,但我仍然想知道是否有这样的方法用于调试和学习目的。
【问题讨论】:
【参考方案1】:我在这里用我的 bindhtml 敲除绑定处理程序创建了一个 JSFiddle: https://jsfiddle.net/glaivier/9859uq8t/
首先,将绑定处理程序保存到其自己的(或通用)文件中,并在 Knockout 之后包含。
如果你使用这个开关你的绑定到这个:
<div data-bind="bindHTML: htmlValue"></div>
OR
<!-- ko bindHTML: htmlValue --><!-- /ko -->
【讨论】:
【参考方案2】:在某些情况下,简单地删除绑定然后重新应用可能会很有用:
ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))
【讨论】:
感谢 ebram 的编辑...我想我应该提到我使用的是 coffeescript ;-) 当心你是否也使用 jQuery(例如,将应用程序的部分迁移到 ko 时),因为 cleanNode 也会删除其他 dom 事件。 这是完美的。应用视图模型后,我无法让 KO 识别具有数据绑定属性的新 dom 子节点。 完美!工作!【参考方案3】:你不能在整个 viewModel 上调用某些东西,但是你可以在单个 observable 上调用 myObservable.valueHasMutated()
来通知订阅者他们应该重新评估。正如您所提到的,这在 KO 中通常不是必需的。
【讨论】:
您还可以遍历数据上下文,搜索具有valueHasMutated
属性的元素,该属性的类型为function
,并为每个元素调用它。这应该得到你所有的 observables,但这是不好的做法,并且可以想象会触发比你预期的更多的更新(想想计算的依赖链)。
如果没有别的,那就太好了 - 在 chrome 中测试。
您的 viewModel 本身可以是可观察的,因此您可以调用 myViewModel.valueHasMutated()
来更新整个视图。
这里也不适用于数组。事实上,数组在 Knockout 中似乎根本不起作用。我想念 Angular :-(
从 KO 3.5 开始,它确实适用于 KnockoutObservableArrays以上是关于如何强制视图刷新而不让它从可观察对象自动触发?的主要内容,如果未能解决你的问题,请参考以下文章
如何强制 MS-Access 自动刷新由具有外部非 MSAccess 数据库后端的触发器修改的记录?