我在我的HTML中使用以下淘汰脚本:
<!-- kno ifnot: bla --> <tr><td>some stuff</td></tr> <!-- /ko -->
我遇到的问题是,在执行绑定之前,这一行将显示一两秒钟。我如何才能防止这种情况发生?
k97glaaz1#
这里有一个简单的技巧。只需将根元素初始化为隐藏,并将可见绑定设置为true。
<div style="display: none;" data-bind="visible: true"> <!-- the rest of your stuff --> </div>
当它被渲染时,在击倒之前,它最初会被隐藏。当绑定被应用时,knockout将覆盖样式并使其可见。或者,您可以将视图放入脚本块中,并通过模板示例化它。脚本块将不会被渲染,但在敲除渲染模板时将可见。
<!-- ko template: 'myView' --><!-- /ko --> <script id="myView" type="text/html"> <!-- the rest of your stuff --> </script>
3yhwsihp2#
因为你想要的行为通常会因页面而异--这就是我在布局/模板文件(ASP.NET)中所做的。
<div class="ko-unbound" data-bind="css: { 'ko-unbound': false, 'ko-bound': true }"> @RenderBody() </div>
当页面被绑定时:
ko-unbound
class
ko-bound
然后在一个页面中,不需要的内容是一个问题,我可以定制css来显示或隐藏基于这两个类的东西。我也使用这种技术来显示一个“加载”图像,或者可能为元素施加一个最小高度。
.ko-unbound #storeWizard { display: none; // hide entire section when the page is binding } .ko-bound #loadingGraphic { display: none; // hide loading graphic after page is bound }
在测试过程中,当应用绑定时,我添加了一个超时,这样我就可以看到闪光。
setTimeout(function () { ko.applyBindings(RR.VM); }, 300);
dojqjjoe3#
把你的html Package 成这样-
<div id="hideme" style="display:none"> </div>
然后在JavaScript中,在apply绑定之后添加以下jquery行-
$('#hideme').show();
这是我发现的最简单的方法。您可以使用一些淘汰绑定来实现这一点,但是由于无法控制绑定的执行顺序,您将失去有保证的时间。
yeotifhr4#
另一个解决方案,我发现here
<div id="binding-start" style="visibility:hidden" data-bind="attr: { 'style': 'visibility:visible' }" />
这有一个优点--也有一个缺点,这取决于你的需要--空间将被保留给隐藏的内容。当应用绑定时,页面不会“跳转”。
dy2hfwbg5#
你可能做错了这是对我有效的方法。
对我来说,原因是我在数据被拉下电线后调用了ko.applyBindings()。我使用TypeScript来创建一堆类,这些类是MVVM中的模型。我使用JSON从一个API构建并填充这些模型。如果您也在以这种方式工作,那么看到模板HTML一秒钟或更长时间是一个信号,您可能正在以一种糟糕的顺序工作。因此,在根视图模型上,为true添加一个isLoading observable boolean默认值。在根视图模型上添加一个populate(data)方法,它接受JSON并填充模型,并在最后设置isLoading(false)。绑定 Package 器<div data-bind="ifnot: isLoading"> ... content将ko.applyBindings(rootViewModel)调用移动到最早的机会,以便它隐藏并隐藏div。然后调用您的API,获取JSON并将其放入rootViewModel.populate(data)。你就快好了现在,您将快速获得HTML的一个预览,因此向这个 Package 器div添加一个淡入过渡,就可以开始了。玩得开心点!
ko.applyBindings()
true
isLoading
populate(data)
isLoading(false)
<div data-bind="ifnot: isLoading"> ... content
ko.applyBindings(rootViewModel)
div
rootViewModel.populate(data)
5条答案
按热度按时间k97glaaz1#
这里有一个简单的技巧。只需将根元素初始化为隐藏,并将可见绑定设置为true。
当它被渲染时,在击倒之前,它最初会被隐藏。当绑定被应用时,knockout将覆盖样式并使其可见。
或者,您可以将视图放入脚本块中,并通过模板示例化它。脚本块将不会被渲染,但在敲除渲染模板时将可见。
3yhwsihp2#
因为你想要的行为通常会因页面而异--这就是我在布局/模板文件(ASP.NET)中所做的。
当页面被绑定时:
ko-unbound
类(最初添加class
属性)。ko-bound
类被添加到页面。然后在一个页面中,不需要的内容是一个问题,我可以定制css来显示或隐藏基于这两个类的东西。我也使用这种技术来显示一个“加载”图像,或者可能为元素施加一个最小高度。
在测试过程中,当应用绑定时,我添加了一个超时,这样我就可以看到闪光。
dojqjjoe3#
把你的html Package 成这样-
然后在JavaScript中,在apply绑定之后添加以下jquery行-
这是我发现的最简单的方法。您可以使用一些淘汰绑定来实现这一点,但是由于无法控制绑定的执行顺序,您将失去有保证的时间。
yeotifhr4#
另一个解决方案,我发现here
这有一个优点--也有一个缺点,这取决于你的需要--空间将被保留给隐藏的内容。当应用绑定时,页面不会“跳转”。
dy2hfwbg5#
你可能做错了这是对我有效的方法。
对我来说,原因是我在数据被拉下电线后调用了
ko.applyBindings()
。我使用TypeScript来创建一堆类,这些类是MVVM中的模型。我使用JSON从一个API构建并填充这些模型。
如果您也在以这种方式工作,那么看到模板HTML一秒钟或更长时间是一个信号,您可能正在以一种糟糕的顺序工作。
因此,在根视图模型上,为
true
添加一个isLoading
observable boolean默认值。在根视图模型上添加一个
populate(data)
方法,它接受JSON并填充模型,并在最后设置isLoading(false)
。绑定 Package 器
<div data-bind="ifnot: isLoading"> ... content
将
ko.applyBindings(rootViewModel)
调用移动到最早的机会,以便它隐藏并隐藏div
。然后调用您的API,获取JSON并将其放入
rootViewModel.populate(data)
。你就快好了现在,您将快速获得HTML的一个预览,因此向这个 Package 器div添加一个淡入过渡,就可以开始了。
玩得开心点!