Dom 版本2中的knockoutjs afterRender问题,在版本1.2.X中不明显

Dom 版本2中的knockoutjs afterRender问题,在版本1.2.X中不明显,dom,knockout.js,templating,Dom,Knockout.js,Templating,我最近将一个现有项目从KnockoutJS 1.2.1更新为KnockoutJS 2.0(尽管我是使用以前的版本启动的)。自从更新之后,我注意到afterRender似乎在元素真正完全进入html之前启动 我环顾了一下四周,根据这一领域的其他几个问题,这似乎是预期的行为: 这个问题在jqueryvalidate中表现出来,我对元素应用了一些规则,它告诉我元素不存在。奇怪的是,在1.2.1中,它曾经工作得很好。我不确定这是因为afterRender在以前的版本中处理方式不同,还是因为对常规本机模

我最近将一个现有项目从KnockoutJS 1.2.1更新为KnockoutJS 2.0(尽管我是使用以前的版本启动的)。自从更新之后,我注意到afterRender似乎在元素真正完全进入html之前启动

我环顾了一下四周,根据这一领域的其他几个问题,这似乎是预期的行为:

这个问题在jqueryvalidate中表现出来,我对元素应用了一些规则,它告诉我元素不存在。奇怪的是,在1.2.1中,它曾经工作得很好。我不确定这是因为afterRender在以前的版本中处理方式不同,还是因为对常规本机模板系统的更改导致其行为不同

如果有更改或这是预期的行为,是否有任何方法可以知道模板元素何时实际进入html,它们应该在哪里?我知道加载的元素是通过afterRender回调参数传回的,但是在这个阶段,使用这些参数进行任何与Dom操作相关的操作是否安全

编辑 我列举了一个具体问题的例子:

如果您查看每个模板的afterRender逻辑,它只会执行一些简单的验证,但是每当您尝试使用元素时,它就会爆炸,但是如果您删除验证逻辑,它就可以正常工作


如果我做错了什么,我非常乐意举手并尝试修复它,但我真的不知道问题出在哪里,因为一切都是独立工作的…

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

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

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


因此,您的函数将被调用两次。您只需要确保在第一次执行任何需要DOM元素存在的代码时,不会出现任何问题。

经过深入挖掘,问题似乎在于模板加载框架,因为它们是异步的。。。由于某些原因,该事件未得到正确处理,因此击倒触发事件两次


理想情况下,我希望仍然能够使用异步加载,但我不确定这是否需要更改敲除或外部绑定。。。或者两者兼而有之……

我是@Grofit在他发布的示例应用程序中使用的外部模板引擎的作者。我已经更新了项目,以便它将afterRender调用包装到一个函数中,该函数首先检查外部模板源的“loaded”布尔标志是否已设置为true。我已经发布了示例项目的更新版本


Ryan-我希望你能对此给出反馈,以防有更好的解决方案。这似乎是最好的选择……

您有一些示例代码吗?在
afterRender期间
元素现在位于DOM中,而以前(1.2.1)它们还不在DOM中。看起来你正在经历相反的情况。目前没有任何例子,这是一个巨大的项目,最初我不确定问题出在哪里,因为我也在使用多个第三方库,但是在为每个库制作测试用例之后,我找不到问题。值得一提的是,我使用的是外部模板系统,但我尝试了两种不同的模板系统,两种敲除显示出相同的问题,我将看看是否可以组合一个快速示例来说明问题,好像你看不到任何立即出现的错误,一定是有什么奇怪的事情发生了。@rp niemeyer添加了一个示例,显示了我当前遇到的问题,尽管错误在jquery validator中显示出来,但问题似乎是它在页面中找不到元素的内容(我想),感谢您的回复,不太理想,但至少我现在知道问题出在哪里了…在这里添加了一条评论:。只需要维护
这个
并将参数传递给real afterAdd函数。