如何强制视图刷新而不让它从可观察对象自动触发?

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 数据库后端的触发器修改的记录?

我如何从可观察对象创建对象,该对象返回对象数组

从可观察对象返回的复杂对象中访问数据

iOS:如何在其附件视图更改时触发 tableViewCell 的约束/自动布局刷新?

如何让ASP的数据无刷新读取

如何在Laravel中“刷新”User对象?