【发布时间】:2012-01-07 22:59:09
【问题描述】:
我最近将一个现有项目从 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期间,元素现在位于 DOM 中,而以前(1.2.1)它们还没有。看来您正在经历相反的情况。 -
目前没有示例,这是一个巨大的项目,最初我不确定问题出在哪里,因为我也在使用多个第三方库,但是在为每个库制作测试用例之后,我可以找不到他们的问题。值得一提的是,我正在使用外部模板系统,但我尝试了 2 个不同的模板系统,并且两个 Knockout 都出现了相同的问题,我将看看我是否可以整理一个快速示例来显示问题,就好像你不能立即看到任何错误,一定是发生了一些奇怪的事情。
-
@rp-niemeyer 添加了一个显示我当前遇到的问题的示例,尽管错误在 jquery 验证器中显示出来,但问题似乎是它无法在页面中找到元素的内容(我想想)
标签: dom knockout.js templating