流星:如何避免检查到处是否存在变量或属性

Meteor: how can I avoid checking for the existence of a variable or property everywhere?

本文关键字:存在 是否 变量 属性 何避免 检查 流星      更新时间:2023-09-26

在 Meteor 中编程时,我经常发现自己在编写模板助手时不得不撒上类型检查或存在检查(至少在几个非常常见的条件下)。

    一个模板的
  • 帮助程序依赖于由另一个模板加载的集合
  • 每当模板帮助程序对另一个模板负责呈现存在的 DOM 片段进行操作时

例如(在第一种情况下):

Template.example.rendered
    rev1 = getRev(revId1)
    revText1 = html2plain(rev1.text)

其中 getRev 正在对修订集合执行操作,该操作可能会也可能不会在首次呈现示例模板时加载。因此,rev1.text 有时会抛出异常,因为如果在加载修订版之前调用,getRev 最终会返回 null 或未定义。

然后,为了安全起见,我最终不得不检查整个代码中的大量变量/对象是否存在,然后再使用它们的任何属性。

  • 我可以想象使用路由器直到不同的集合准备就绪后才呈现我的示例模板(但对于嵌套模板和会话变量更改,这不会那么热)。
  • 我可以将帮助程序代码包装在 if (isCollectionReady) 中,这可能会有所帮助,但似乎不是最佳实践。

问题是:是否有一种规范或最佳实践方法来识别这些情况,为它们编码,或者完全避免这种情况?

Meteor 的设计使其模板是反应式的,因此在大多数情况下,您不需要对它们进行 DOM 操作。当基础数据更改时,模板会自动重新呈现,以便它们始终显示最新数据。看看 Meteor 文档中的示例:它们不使用任何 DOM 操作代码。模板将数据放入正确的位置,这就是他们所需要的。

根据我的经验,有两个常见原因需要将代码放入rendered

  1. 您正在加载一个小部件,该小部件需要在模板呈现并准备就绪后进行初始化,就像<select>替换一样。
  2. 你正在做动画。(在这种情况下,我通常会告诉我的模板将所有内容放在适当的位置,但使用隐藏元素的 CSS 类,然后rendered所做的只是对显示的内容进行动画处理。
模板

在加载订阅之前呈现通常是可以的;在最坏的情况下,模板将呈现空白,然后在数据流入时重新呈现。另请记住,可以从模板帮助程序以外的客户端代码subscribe,例如客户端Meteor.startup。最后不要忘记created助手;如果您真的想等到模板加载后再订阅,那将是比订阅更好的地方 rendered ,因为它被调用得更快。

你在做什么 DOM 操作,为什么?假设您没有使用小部件或动画,则很有可能可以通过自行使用模板来实现所需的内容,而无需任何其他操作代码。