我正在使用knockoutjs扩展来将加载器放在从ajax请求加载的元素之上,以便在执行请求时显示加载gif。
fiddle非常基本:
问题是,我第一次点击头像时,没有显示加载图标,但所有后续点击都有效。 我在这里缺少什么?
谢谢!
答案 0 :(得分:1)
您看到的问题与在同一元素上同时拥有with
和自定义绑定有关。当值为null时,with
绑定将清除子元素。这将删除您的加载程序(虽然它已作为with
绑定使用的“模板”的一部分被复制掉),但在填充infos
时会被放回。将它们放在同一个元素上也意味着绑定会触发两次(一次更改infos
,一次更新isAvatarLoading
。
解决这个问题的简单方法是拆分绑定:
<div class="avatar" style="margin-left: 55px;" data-bind="loadingWhen: isAvatarLoading">
<div data-bind="with: infos">
<div data-bind="text: firstName"></div>
<div data-bind="text: lastName"></div>
<div data-bind="text: age"></div>
<div data-bind="text: description"></div>
<div style="margin-left: 55px;" id="" data-bind="with: image">
<img data-bind="attr: { src: Url }" />
<div data-bind="text: Description"></div>
</div>
</div>
</div>
如果您不想添加其他元素,则可以使用无容器with
语法,如:
<div class="avatar" style="margin-left: 55px;" data-bind="loadingWhen: isAvatarLoading">
<!-- ko with: infos -->
<div data-bind="text: firstName"></div>
<div data-bind="text: lastName"></div>
<div data-bind="text: age"></div>
<div data-bind="text: description"></div>
<div style="margin-left: 55px;" id="" data-bind="with: image">
<img data-bind="attr: { src: Url }" />
<div data-bind="text: Description"></div>
</div>
<!-- /ko -->
</div>