删除meteor 0.8.0中插入的模板

删除meteor 0.8.0中插入的模板,meteor,meteor-blaze,Meteor,Meteor Blaze,我使用UI.render()和UI.insert()插入模板 当我试图删除我插入的模板时,它似乎保留在内存中,并且没有调用销毁的方法 根据文档,如果我使用jquery删除元素,它应该清理属性 我正在使用以下代码对其进行测试: test.html: 除去 #内容{ 高度:500px; 宽度:500px; 背景颜色:灰色; } 福 test.js: if(Meteor.isClient){ UI.body.events({ “点击”:功能(事件){ var instance=UI.renderW

我使用UI.render()和UI.insert()插入模板

当我试图删除我插入的模板时,它似乎保留在内存中,并且没有调用销毁的方法

根据文档,如果我使用jquery删除元素,它应该清理属性

我正在使用以下代码对其进行测试:

test.html:


除去
#内容{
高度:500px;
宽度:500px;
背景颜色:灰色;
}
福
test.js:

if(Meteor.isClient){
UI.body.events({
“点击”:功能(事件){
var instance=UI.renderWithData(Template.foo,{});
UI.insert(实例,$(“#内容”)[0]);
}
});    
Template.foo.created=函数(){
this.data.id=“handle”;
var self=这个;
this.x=setInterval(function(){console.log(“running…”)),1000);
setTimeout(function(){$(“#handle”).remove()},1000);
};    
Template.foo.destromed=函数(){
//从未打过电话。
clearTimeout(this.x);
};
}
我做错了什么


谢谢。

我最近也遇到了这个问题。在Meteor提供补丁之前,现在的解决方案是将删除功能更改为:

setTimeout(function() { 
  $("#handle").remove() 
  self.__component__.isRemoved = true;
}, 1000);

至于clearTimeout。。。我们将不得不等待补丁,我认为

根据Avital 4月19日的说法,代码正在重写()

同时,如果查看节点元素
$(“#handle”)[0]
的属性,您将看到一个名为
$ui
的元素,它对应于
DomRange
对象()。如果在
DomRange
对象上调用
remove
,则将触发
destrocted
回调。事实上,它还将为任何嵌套模板触发回调

$("#handle")[0].$ui.remove()

这目前是Meteor中的一个bug,在以下相关GitHub问题中被跟踪:


释放模板时应将其修复。

删除插入模板的一些选项:

a)在模板中使用关闭事件。

Template.foo.events({
  'click a.close' : function(e, t) {
    e.preventDefault();

    t.__component__.dom.remove();
    return false;
  }
});
b)使用助手和实例引用

Template.foo.helpers({
  destroy: function() {
    this.dom.remove();
  }
});

var instance = UI.renderWithData(Template.foo, { });
UI.insert(instance, $("#content")[0]);
instance.destroy();

我在meteor 1.0.3.2上,因此在提出问题时,此解决方案可能不可用。Blaze实际上提供了一个
remove
方法,该方法删除以前呈现的模板视图并调用
destrocted
回调

您的代码如下所示:

Template.foo.rendered = function() {
  var self = this;
  this.x = setInterval(function() { console.log("running...") }, 1000);
  setTimeout((function() {
    UI.remove(self.view);
  }), 1000);
};

Template.foo.destroyed = function() {
  return clearTimeout(this.x);
};
请注意,您可能希望使用
创建的
回调,而不是
呈现的
回调。这是因为
remove
需要一个已经在DOM中呈现的视图。您可以在此处阅读有关这两个回调之间差异的更多信息:


有关Blaze提供的UI功能的更多信息,请参阅此处

能否提供更多信息,说明为什么要手动而不是通过手柄渲染模板?检查浏览器控制台是否存在错误,例如
“未捕获类型错误:无法将属性“id”设置为null”
UI.render
函数将
data
上下文设置为
null
。您可能可以使用
UI.renderWithData
,但我怀疑有一个更优雅的解决方案,使用手柄,让Meteor正常处理较低级别的渲染。我正在编写一个应用程序,它将基于使用交互(类似于dhtml)动态创建节点。id部分工作正常。调用setTimeout时,将删除div。只是被破坏的回调没有被调用。也许.remove()没有调用已销毁回调的钩子?我进一步查看了源代码,似乎meteor中有一个bug。有两个回调订阅onRemove,第一个调用attrUpdater.stop();和另一个调用rangeRemoved(范围);调用了带有attrUpdater.stop()的匿名函数,但没有调用带有rangeRemoved(range)的匿名函数。rangeRemoved(range)是一个调用已销毁回调的函数。不使用
UI.render
,它应该是可行的。您应该能够使用helper函数从本地集合返回一个游标,以驱动带有
{{{each}
块的模板的呈现。然后,您的单击事件就可以插入到本地集合中,当相关文档从集合中删除时(超时),将调用您的
destrocted
函数。谢谢。是的,它实际上可以使用
{{{each}}
块来完成。在这种情况下,将调用
销毁的
函数。最初的问题仍然存在,我认为这是当前实现中的一个bug。我已经在github上提交了一个关于这个的问题。太好了。这表明meteor应该有办法很好地处理这个问题。我已拆除我的环境,因此无法验证您的解决方案。你有什么演示项目,我可以快速看一下吗?我想将您的答案标记为解决方案。
instance.destroy()
在0.8.2上对我不起作用,但
instance.dom.remove()
对我起作用。我使用的
instance.destroy()
取决于先前创建的帮助程序。该helper方法正在调用
instance.dom.remove()
,只是为了在控制器中使其更干净一点。我猜你没有正确地实现助手。啊,是的,这是有道理的