我的问题涉及网络应用程序的常见场景:您有某种类型的数据库项目可以映射到某些类型的DOM项目。例如。一个JSON对象,映射到带有一些字段的form
。
现在想象一下,在表单内的不同位置/不同事件上,您需要该数据库ID。在某些级别(在某些数据上下文中),id将在Meteor事件中以this._id
的形式提供,但不是全部,因为子#with
语句可能会覆盖数据上下文。
我目前在这些情况下执行的操作是在包含<form id="{{_id}}" ...>
表单的模板中设置,然后在this._id
不可用的事件中,我通过$(this).closest('form').id
获取。这很有效。
但我的问题是:有更好的方法吗?你怎么用Meteor做的?
答案 0 :(得分:1)
这是我们很多人都在努力的事情......要保持DOM清洁amirite吗?
如果您的DOM层次结构是可预测的,则可以使用Template.parentData(n)
来获取父数据上下文。
或者,如果与您需要的上下文无关,请使用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;
}
接下来,如果您最顶层的模块拥有自己的路线,您可以将其存储为铁路由器参数。这很好,因为它将id
粘贴在网址中以便于分享,我个人喜欢干净的网址,但其他人喜欢这个。
最后,我自己的模式是一个模块范围的对象。就我而言,对于每条路线,在onCreated
我设置了我的对象window.M = {}
。然后,我用本地集合,反应性字典和我需要的任何其他内容填充它。我清楚onDestroyed
。当然,它在技术上是一个全球性的,但范围随着模块而消亡。
消除#with
:
{{#with collection='clients'}}
{{>subTemplate}}
{{/with}}
Becomes
{{>subTemplate collection= 'clients'}}
将#with
分配给上下文中的对象:
```
{{#with collection =&#39; clients&#39;}}
{{&gt; subTemplate name =&#39; foobar&#39;}} //你在这里失去了上下文
{{/与}}
变
{{&gt; subTemplate collection =此名称=&#39; foobar&#39;}} //将上下文保留在对象中
通过空格键访问初始父数据&#39;双点&amp;将上下文一直引用{{>subTemplate parent=..}}
```
这些是我目前用来保持干净DOM的所有模式。如果有人建议另一个人,将很乐意编辑。