gpt4 book ai didi

javascript - 对象来自哪个 Meteor 集合?

转载 作者:行者123 更新时间:2023-12-02 16:40:38 25 4
gpt4 key购买 nike

我有一个自定义 block 助手(本质上是一个 {{#each}} 循环),它呈现 Mongo.Collection.find() 的结果:

{{#sortable items=someCursor}}
{{> sortableItemTarget}}
{{/sortable}}

在 sortableItemTarget 模板事件处理程序中,如何访问父数据上下文,即项目来自的集合(或至少是光标)?

因为a bug ,自定义 block 助手模板事件处理程序无权访问父数据上下文。

换句话说,如果我运行

var items = Mongo.Collection('items');
...
var item = items.findOne({...});

如何使用 item._collection.remove() 之类的方法轻松从集合中删除 item

最小代码是 in this GitHub repo .

最佳答案

我知道我已经发表了评论,但思考了 30 秒后,我觉得我应该给出一个更正确的答案。

我在 Meteor 之旅中学到的技巧之一是,在处理帮助程序和事件监听器时,this 的上下文指向何处。例如,如果我有一个 {{#with XXX}} block ,那么任何被调用的事件处理程序或助手都会引用 XXX 作为其 this。这是一个很好的功能,因为我可以用一种非常通用的方式编写代码来简单地处理任何一个给定的元素,并且它会成倍增加,并且根据 Meteor 的本质“适用于”多个元素。

其次,我通过异步 Meteor.call 进行所有数据操作。我还没有深入研究组合客户端和服务器 Meteor.call,因为我没有必要这样做,但我查看了代码,它看起来一点也不复杂。我这样做是为了保持 react 性,并让 Meteor 执行此“操作”并在数据更新时更新模板。

最后,当没有简单的方法来获取我想要的数据时,我在Blaze.getData()中找到了爱情。 。事实证明,它对于在 DOM 的任何部分获取数据都是不可或缺的。

因此,为了将其付诸实践,这是我直接从头骨中提取的一个示例,没有进行任何测试。

首先,我的模板中需要一个循环。像这样的东西:

<table>
{{#each myWidgets}}
<tr>
<td>{{myWidgetTitle}}</td>
<td>{{myWidgetData}}</td>
<td><button class="bntRemoveWidget">Remove Widget</button></td>
</tr>
{{/each}}
</table>

这里我假设我的模板数据有一个 .myWidgets 数组,每个“小部件”都有一个 myWidgetTitle 和一个 myWidgetData 属性。我还有一个用于删除小部件的按钮。

接下来,我需要一个事件处理程序。足够简单

Template.myWidgetTable.events({
'click .btnRemoveWidget': function(event, tmpl) {
var myWidget = Blaze.getData(event.getTarget()); // This bit of magic gets me the widget in context where the button was clicked!
Meteor.call('removeWidget', myWidget._id, function(err, result) {
if (err) {
// Do something with the error!
} else {
// Add some success message???
}
});
}
});

最后,我需要编写处理删除的方法(我没有编写代码,因为这是与问题无关的单独讨论):

Meteor.methods({
removeWidget: function(myWidgetId) {
// Select the item that contains the widget id, remove it, and save it back to the collection
}
});

现在,由于我的模板对包含 myWidgets 数组的对象使用react,因此只需更新服务器上数组的内容就会引起适当的链式 react ,从而在 UI 中实现同样的效果。同样,您可以“花哨”地使用 Meteor.call 和 Meteor.methods 来制作相应的客户端和服务器版本,并且会发生的情况是该方法在两者上运行,更新客户端,以便 UI 无需等待即可立即更新,还要更新服务器,以便数据库中的实际数据是正确的。当发布 channel 最终同步时,Meteor 足够智能,可以将客户端所做的更改与服务器中所做的更改进行协调。据说它还可以缓存来自客户端的更新,并在连接恢复时同步,尽管我还没有测试过。

关于javascript - 对象来自哪个 Meteor 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27530336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com