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

156

注意: 这主要用于调试和理解KnockoutJS。

是否有一种明确的方法可以请求Knockout从(已绑定)视图模型中刷新视图?我正在寻找像这样的东西:

ko.refreshView();

我知道这不是 Knockout 的预期用途,但我仍然想知道是否有这样一种方法用于调试和学习目的。

4个回答

260

在整个viewModel上你不能调用某个东西,但是在单个可观察对象上,你可以调用myObservable.valueHasMutated()来通知订阅者重新评估。一般情况下在KO中这是不必要的,就像你所提到的那样。


5
您还可以迭代数据上下文,查找具有 valueHasMutated 属性的元素,该属性的类型为 function,并对每个元素调用它。这应该可以获取您所有的可观察对象,但这是一种不良的实践,并且可能会触发比预期更多的更新(考虑计算依赖链)。 - Patrick M
如果仅仅是为了在 Chrome 中进行测试,那肯定很不错。 - Scott Romack
你的viewModel本身可以是一个observable,因此你可以调用myViewModel.valueHasMutated()来更新整个视图。 - Roy J
2
这里对数组也不起作用。事实上,数组在Knockout中似乎根本不起作用。我想念Angular :-( - garryp
2
从 KO 3.5 开始,它可以在 KnockoutObservableArrays 上工作。 - balint
valueHasMutated在observableArray上不起作用时,可以使用“脏刷新”方法,请参见此处:https://dev59.com/ZmYs5IYBdhLWcg3wAfAi#13231783 - mft25

25

在某些情况下,仅仅将绑定删除然后重新应用可能会很有用:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))

感谢您的编辑,ebram... 我应该提到我使用CoffeeScript了;-) - ProfNimrod
15
如果您同时使用jQuery(例如在将应用程序的一部分迁移到ko时),请注意,cleanNode也会删除其他dom事件。 - Daniel Revell
这太完美了。在应用视图模型后,我无法让KO识别具有data-bind属性的新DOM子元素。 - Andrew T Finnell
完美!正常工作! - jeff_drumgod

0

我在这里创建了一个带有bindHTML knockout绑定处理程序的JSFiddle: https://jsfiddle.net/glaivier/9859uq8t/

首先,将绑定处理程序保存到自己的(或公共的)文件中,并在Knockout之后包含。

如果您使用此功能,请将绑定切换为:

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->

0

一种简单的替代方法是清除可观察数组:

let tmp = myObservableArray();
myObservableArray([]);
myObservableArray(tmp);

注意:这种替代方案可能会影响性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接