knockout.js 如何防止在执行敲除绑定之前显示Html

olmpazwi  于 7个月前  发布在  其他
关注(0)|答案(5)|浏览(68)

我在我的HTML中使用以下淘汰脚本:

<!-- kno ifnot: bla -->

 <tr><td>some stuff</td></tr>

<!-- /ko -->

我遇到的问题是,在执行绑定之前,这一行将显示一两秒钟。
我如何才能防止这种情况发生?

k97glaaz

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>
3yhwsihp

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);
dojqjjoe

dojqjjoe3#

把你的html Package 成这样-

<div id="hideme" style="display:none">
</div>

然后在JavaScript中,在apply绑定之后添加以下jquery行-

$('#hideme').show();

这是我发现的最简单的方法。您可以使用一些淘汰绑定来实现这一点,但是由于无法控制绑定的执行顺序,您将失去有保证的时间。

yeotifhr

yeotifhr4#

另一个解决方案,我发现here

<div id="binding-start" style="visibility:hidden" data-bind="attr: { 'style': 'visibility:visible' }" />

这有一个优点--也有一个缺点,这取决于你的需要--空间将被保留给隐藏的内容。当应用绑定时,页面不会“跳转”。

dy2hfwbg

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添加一个淡入过渡,就可以开始了。
玩得开心点!

相关问题