如何通过Meteor.js模板传播db id?

时间:2015-04-23 16:33:06

标签: javascript mongodb meteor

我的问题涉及网络应用程序的常见场景:您有某种类型的数据库项目可以映射到某些类型的DOM项目。例如。一个JSON对象,映射到带有一些字段的form

现在想象一下,在表单内的不同位置/不同事件上,您需要该数据库ID。在某些级别(在某些数据上下文中),id将在Meteor事件中以this._id的形式提供,但不是全部,因为子#with语句可能会覆盖数据上下文。

我目前在这些情况下执行的操作是在包含<form id="{{_id}}" ...>表单的模板中设置,然后在this._id不可用的事件中,我通过$(this).closest('form').id获取。这很有效。

但我的问题是:有更好的方法吗?你怎么用Meteor做的?

1 个答案:

答案 0 :(得分:1)

这是我们很多人都在努力的事情......要保持DOM清洁amirite吗?

  1. 如果您的DOM层次结构是可预测的,则可以使用Template.parentData(n)来获取父数据上下文。

  2. 或者,如果与您需要的上下文无关,请使用Blaze.getData(el)。我有一种感觉,这将成为你最好的朋友。我知道,一旦我偶然发现它,我觉得我在欺骗它是如此容易。 这是我最喜欢的用法(在一个事件中,迭代所有输入字段): var checkFields = t.findAll('input'); var allGood = true; for (var i = 0; i < checkFields.length; i++) { if (!simplyValid.validateField(Blaze.getData(checkFields[i]), checkFields[i].value)) allGood = false; }

  3. 接下来,如果您最顶层的模块拥有自己的路线,您可以将其存储为铁路由器参数。这很好,因为它将id粘贴在网址中以便于分享,我个人喜欢干净的网址,但其他人喜欢这个。

  4. 最后,我自己的模式是一个模块范围的对象。就我而言,对于每条路线,在onCreated我设置了我的对象window.M = {}。然后,我用本地集合,反应性字典和我需要的任何其他内容填充它。我清楚onDestroyed。当然,它在技术上是一个全球性的,但范围随着模块而消亡。

  5. 消除#with {{#with collection='clients'}} {{>subTemplate}} {{/with}} Becomes {{>subTemplate collection= 'clients'}}

  6. #with分配给上下文中的对象: ``` {{#with collection =&#39; clients&#39;}}   {{&gt; subTemplate name =&#39; foobar&#39;}} //你在这里失去了上下文 {{/与}} 变 {{&gt; subTemplate collection =此名称=&#39; foobar&#39;}} //将上下文保留在对象中

  7. 通过空格键访问初始父数据&#39;双点&amp;将上下文一直引用{{>subTemplate parent=..}} ```

  8. 这些是我目前用来保持干净DOM的所有模式。如果有人建议另一个人,将很乐意编辑。