渲染后的淘汰赛过早触发
Knockout afterRender fires too early
本文关键字:淘汰赛 更新时间:2023-09-26
我指定了一些knockout绑定。我需要运行一些脚本后,整个页面被渲染。
<div class="row-fluid" data-bind="foreach: { data: rows, afterRender: myCallback }">
</div>
不幸的是,myCallback
被调用得太早-并不是所有的DOM元素都被渲染,元素的大小还没有计算(更重要的是,myCallback需要调用init函数的堵塞,这需要计算所有元素的大小)
我怎么能调用myCallback
时,页面上的所有DOM元素被渲染(和绑定应用)?
我写了一个小hack:
<div class="location-map-div" data-bind="openLayers: Value, attr: { style: 'width: 50%; height: 200px' }" style="width:100px; height:100px"></div>
我已经设置了内联样式,所以我的插件可以初始化,然后改变大小与knockout绑定
afterRender在你的'rows'数组中的每个元素被调用。你应该检查你是否在最后一个元素上。
<div class="row-fluid" data-bind="foreach: { data: rows, afterRender: thenDoStuff }">
</div>
viewModel.lastItem = ko.computed(function() {
return this.items()[this.items().length - 1];
}, viewModel);
viewModel.thenDoStuff = function(elements, data) {
if (data === viewModel.lastItem()) {
alert('last one!');
var parent = $(elements).filter('li').parent();
}
};
下面是我发现并修改的一个例子:http://jsfiddle.net/Z6yqq/8/
您可以创建一个自定义绑定,在呈现过程中调用事件:
ko.bindingHandlers.onRender = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
var events = ko.unwrap(value);
if(events.once)
events.once.call();
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
var events = ko.unwrap(value);
if(typeof events == 'function')
events.call();
if(events.each)
events.each.call();
}
};
绑定的使用方法如下:
<div data-bind="onRender:{once: firstCall, each: eachCall}"/>
每次knockout渲染这个div时,都会调用eachCall函数。
看到小提琴
相关文章:
- 淘汰赛.JS'启用'长度绑定条件不起作用
- 淘汰赛's在Angular中的纯计算等价物
- 选择选项淘汰赛事件不起作用
- 淘汰赛JS;绑定值未更新或 ko.computed() 未更新
- 淘汰赛-给一个<李>foreach中的元素<ul>其中<李>元素
- 淘汰赛:can't在foreach块内进行条件输出
- 淘汰赛:can't从嵌套foreach访问父级范围的属性
- 可以'不要跑淘汰赛
- 淘汰赛获胜;t处理多选列表的数字数组
- 淘汰赛和 ASP.NET MVC 4
- 无法写入可观察的淘汰赛
- 淘汰赛.js-->这是什么?--> $.map.
- 淘汰赛.js事件上下文
- 淘汰赛仅更新事件一次
- 杜兰达尔淘汰赛点击事件
- BreezeJs,RequireJs和淘汰赛,但没有可观察量
- 如何将谷歌放置 API 结果数组与淘汰赛集成
- 淘汰赛可观察量和性能
- IE8 的淘汰赛 - 失去点击绑定
- 使用sammy设置可观察的淘汰赛进行路由