我有一个使用KnockoutJS的ASP.NET MVC4 SPA Web应用程序,这有点尴尬,因为据我所知,当页面最初在SPA中加载时,在AJAX调用检索它之前通常没有数据。当我尝试使用类似data-bind="with: myData"
的属性绑定块内的所有类型的数据时,该节点内的整个DOM都会被清空,直到myData变为有效,这让我感到紧张,如果某些脚本可能依赖于这些元素可以附加脚本或其他东西。在加载过程中,页面的块消失并重新出现也很糟糕。所以我设计了一个with
绑定的变体,如果值为空,它将阻止后代绑定,目前看起来像这样:
ko.bindingHandlers.safeWith = {
'init': ko.bindingHandlers.with.init,
'update': function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var value = ko.utils.unwrapObservable(valueAccessor());
if ((value != undefined) && (value != null))
ko.bindingHandlers.with.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
};
然后,我只需使用safeWith
代替with
,以确保在等待myData
填充时我的DOM不会消失。
我的问题是:
答案 0 :(得分:1)
我已经实现了一个自定义bindIf
绑定处理程序,通过推迟绑定逻辑直到observable在其中有一个有效值来显着改善我们的结果:
ko.bindingHandlers.bindIf = {
'init': function (element, valueAccessor) {
return { 'controlsDescendantBindings': true };
},
'update': function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
if (!$(element).data("bindIfPassed") && valueAccessor()) {
$(element).data("bindIfPassed", true);
ko.applyBindingsToDescendants(bindingContext, element);
}
}
}
应用于这样的高级节点:
<div data-bind="bindIf: myObservable()">
答案 1 :(得分:0)
我可以看到为什么你不希望带有绑定元素的DOM消失的原因,但它们很少。几乎所有这些都涉及需要特定时序的DOM操作。例如,在显示视图时将焦点设置为第一个输入字段。有时,这些问题的解决方法并不漂亮,在这种情况下,像你这样的绑定肯定会有很大的帮助。
一般来说,