Javascript foreach绑定中的knockoutjsafterrender函数

Javascript foreach绑定中的knockoutjsafterrender函数,javascript,knockout.js,Javascript,Knockout.js,我试图使用knockoutjsforeach绑定在插入的元素上指定入口效果。非常简单的设置: myViewModel.myObservableArray.push({enter:function() { ... }); 在标记中: foreach:{data:myObservableArray, afterRender:enter} 看起来它应该有用。。。正确的?但它没有在该项上找到enter函数。我发现它的作用是: myViewModel.enter = function(somethin

我试图使用knockoutjsforeach绑定在插入的元素上指定入口效果。非常简单的设置:

myViewModel.myObservableArray.push({enter:function() { ... });
在标记中:

foreach:{data:myObservableArray, afterRender:enter}
看起来它应该有用。。。正确的?但它没有在该项上找到enter函数。我发现它的作用是:

myViewModel.enter = function(something, item) { item.enter(); };

foreach:{data:myObservableArray, afterRender:$root.enter}
向根视图模型添加enter函数,并将
afterRender
绑定到$root.enter。然后,Enter将该项作为第二个参数传递,这样就可以依次调用该项的Enter函数,但这感觉像是一个黑客

有人能解释一下这是怎么回事吗

谢谢

编辑:

为了澄清,我创建了一个

这一点非常简单,本章将对其进行更深入的介绍。它在根视图模型中为使用foreach绑定插入的每个dom元素运行一个函数

所以问题是:如果我想要特定于项目的afterRender、afterAdd或beforeRemove函数怎么办?我觉得这很有用。尤其是使用模板绑定动态选择模板()。有没有一个干净的方法可以做到这一点?现在,我在视图模型的根目录中有一个
enter
函数,它只调用项目上的
enter
函数,但正如我上面所说的,这感觉像是一个黑客行为。

不,就是这样

从:

注3:使用“afterRender”、“afterAdd”和“beforeRemove”

有时,您可能希望对模板生成的DOM元素运行自定义后处理逻辑。例如,如果您正在使用诸如jQuery UI之类的JavaScript小部件库,您可能希望截取模板的输出,以便可以在其上运行jQuery UI命令,将一些呈现的元素转换为日期选择器、滑块或其他任何内容

通常,对DOM元素执行此类后处理的最佳方法是编写一个脚本,但如果您确实只想访问模板发出的原始DOM元素,则可以使用afterRender

传递函数引用(可以是函数文本,也可以是视图模型上的函数名),Knockout将在呈现或重新呈现模板后立即调用它

(强调矿山)


正如它所说的,自定义绑定是另一种方式,并且可能更好,这取决于
enter()
函数的功能。

在这种情况下,下划线去Bounce(u.debounce)是一个很好的解决方案

模板

data-bind=" template: {foreach:myObservableArray, afterRender: runWhenAllRenderDone }
如果在最后100毫秒内未触发afterRender,则将执行去盎司功能

var runWhenAllRenderDone = _.debounce(myFunction, 100);

function myFunction(){
    //do some task but do it for once only
}

是不是很棒?

找到了另一种无超时的解决方法,这种技术基于虚拟元素

它的模板是

<tbody data-bind="foreach: seats">
    <tr>
        <td data-bind="text: name"></td>
        <td data-bind="text: meal"></td>
        <td data-bind="text: price"></td>
    </tr>    
    <!-- ko if: $parent.afterRender($index()) --><!-- /ko -->
</tbody>


这个额外的逻辑
i===This.seats().length-1将检查最后一行是否呈现。。然后我们可以在内部执行afterRender逻辑。

复制和粘贴文档与回答问题并不总是一回事。我已经看过文件了。虽然我知道在这个论坛上并不总是这样,所以我取消了否决票。那只是一种沮丧的谈话…@nicholas抱歉让你失望了,我不是想回避你的问题。我试图做的不仅仅是粘贴文档,但除此之外的解释非常简单。你似乎在问它为什么会这样,答案是:因为它是被设计来的。是的,在我想到它之前,我匆忙按下了向下按钮。当然,你是对的。我把这个问题修改得更清楚了。如果我试图做的(有一个自定义的、特定于项的、afterAdd函数)不是knockout默认做的,那么问题就变成了:我如何让它做我想做的?有什么我看不到的把戏吗?还是一段我可以使用的代码?如果有人已经为我完成了工作,我真的不想浪费一天的时间来重建foreach绑定…那应该是下划线debounce,而不是主干线。+1在我的情况下,我不能使用'afterRender'来确保knockout的引擎已经完成了html的呈现,因为我封装了函数的逻辑,该函数可以更改ObservalArray中的项;无法从html访问代码。我知道这并不优雅,但在调用另一个将css添加到新元素节点的函数之前,我还使用了x毫秒的超时。事实上,我只设置了一个1毫秒的超时时间,在刷新页面几十次之后,我看不到任何html刷新不正确的情况。非常感谢。
<tbody data-bind="foreach: seats">
    <tr>
        <td data-bind="text: name"></td>
        <td data-bind="text: meal"></td>
        <td data-bind="text: price"></td>
    </tr>    
    <!-- ko if: $parent.afterRender($index()) --><!-- /ko -->
</tbody>