我最近将一个现有项目从KnockoutJS 1.2.1更新到了KnockoutJS 2.0(尽管我是使用以前的版本启动的)。自从更新以来,我注意到afterRender似乎在元素实际上完全在html中之前触发。

我做了一些环顾四周,看来这是根据该领域其他一些问题得出的预期行为:

Why are template divs showing as ":hidden" in afterRender?

这个问题通过Jquery Validate表现出来,我在其中对元素应用了一些规则,并告诉我元素不存在。奇怪的是,这在1.2.1中可以正常工作。我不确定这是因为在以前的版本中对afterRender进行了不同的处理还是由于对常规本机模板系统的更改导致其行为不同...

如果进行了更改或这是预期的行为,那么有什么方法可以知道模板元素何时实际输入了html的位置?我知道已加载的元素是通过afterRender回调参数传递回来的,但是在此阶段将这些元素用于Dom操作的上下文是否安全?

编辑

我整理了一个具体问题的例子:
Example project showing issue

如果您查看每个模板的afterRender逻辑,它只会执行一些简单的验证,但是每当您尝试使用元素时,它都会被炸掉,但是,如果您取出验证逻辑,它将很好地工作。

如果我做错了什么并尝试修复它,我很乐意举手,但老实说,我不知道问题出在哪里,因为一切都是孤立的...

最佳答案

问题是外部模板引擎异步加载模板,并最初使用“加载”模板。这意味着您的afterRender函数被调用两次。该引擎当前没有使用纯模板后仅运行afterRender的选项。我将看看添加对它的支持将需要什么。

您有一些选择:
-向afterRender函数传递元素数组作为第一个参数。您可以检查数组以查看其是否包含实际元素。

-否则,在连接代码中,您可以在进行验证调用之前检查元素是否存在。

因此,您的函数将被调用两次。您只需要确保第一次不执行任何需要显示DOM元素的代码即可。

09-16 23:44