Javascript Meteor:我怎样才能避免到处检查变量或属性的存在?

Javascript Meteor:我怎样才能避免到处检查变量或属性的存在?,javascript,exception,meteor,Javascript,Exception,Meteor,在Meteor中编程时,我经常发现自己在编写模板助手时必须进行一些类型检查或存在性检查(至少在一些非常常见的情况下) 一个模板的帮助程序取决于由不同模板加载的集合 任何时候,模板助手对另一个模板负责呈现的DOM块进行操作时 例如(在第一种情况下): 其中,getRev正在对修订集执行操作,在示例模板首次呈现时,该操作可能会加载,也可能不会加载。所以rev1.text有时会抛出异常,因为如果在加载修订之前调用getRev,则返回null或undefined 然后,为了安全起见,在使用变量/对象

在Meteor中编程时,我经常发现自己在编写模板助手时必须进行一些类型检查或存在性检查(至少在一些非常常见的情况下)

  • 一个模板的帮助程序取决于由不同模板加载的集合
  • 任何时候,模板助手对另一个模板负责呈现的DOM块进行操作时
例如(在第一种情况下):

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

然后,为了安全起见,在使用变量/对象的任何属性之前,我必须检查代码中大量的变量/对象是否存在

  • 我可以想象使用路由器在不同的集合准备好之前不呈现示例模板(但对于嵌套模板和会话变量更改,这并不是很有效)
  • 我可以想象用if(isCollectionReady)包装助手代码,这可能会有所帮助,但似乎不是最佳实践

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

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

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

  • 您正在加载一个小部件,该小部件需要在模板呈现并准备就绪后进行初始化,如替换
  • 你在做动画。(在这种情况下,我通常告诉模板将所有内容放在适当的位置,但使用一个隐藏元素的CSS类,然后所有
    渲染的
    都将显示动画。)
  • 模板在其订阅加载之前呈现通常没有问题;在最坏的情况下,模板将只呈现为空白,然后作为中的数据流重新渲染。还请记住,您可以从客户端代码(而不是模板助手)订阅
    ,例如客户端的
    Meteor.startup
    。最后,不要忘记创建的
    助手;如果您真的想等到模板加载后再订阅,那将是一个比
    rendered
    更好的订阅位置,因为它调用得更快


    你在做什么DOM操作?为什么?假设您不使用小部件或动画,那么您可以通过自己使用模板来实现所需的功能,而无需任何额外的操作代码。

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

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

  • 您正在加载一个小部件,该小部件需要在模板呈现并准备就绪后进行初始化,如替换
  • 你在做动画。(在这种情况下,我通常告诉模板将所有内容放在适当的位置,但使用一个隐藏元素的CSS类,然后所有
    渲染的
    都将显示动画。)
  • 模板在其订阅加载之前呈现通常没有问题;在最坏的情况下,模板将只呈现为空白,然后作为中的数据流重新渲染。还请记住,您可以从客户端代码(而不是模板助手)订阅
    ,例如客户端的
    Meteor.startup
    。最后,不要忘记创建的
    助手;如果您真的想等到模板加载后再订阅,那将是一个比
    rendered
    更好的订阅位置,因为它调用得更快


    你在做什么DOM操作?为什么?假设您不使用小部件或动画,那么您可以通过自己使用模板来实现所需的功能,而无需任何额外的操作代码。

    避免使用我通常使用的DOM。对我来说,更棘手的事情是与本地集合或在集合上运行的客户端和服务器上运行的代码进行接口。我的主要示例可能执行一个RevCollection.findOne({title:titleOf})并将其分配给变量“rev1”。在我看来,每次我这样做的时候,我要么必须在检查rev1是否存在的过程中包装以下所有代码,要么检查rev1的任何属性是否存在……例如。rev1.text在我实际使用它之前,或者在模板帮助程序和其他代码中存在异常(所有这些都是因为集合可能没有加载)的真实风险是的,您几乎总是需要进行快速检查。类似于
    返回if Session.equals('rev1',null)作为任何函数的第一行。对于模板,虽然您不需要麻烦。将整个模板包装在
    {{#if this}
    中(假设使用
    rev1
    session变量作为上下文调用模板),如果
    rev1
    为空,模板将不会呈现。避免使用我通常得到的DOM内容。对我来说,更粘的东西是与本地收藏或
    Template.example.rendered
        rev1 = getRev(revId1)
        revText1 = html2plain(rev1.text)