微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我最近从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元素存在的代码.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐