Javascript Backbone.js`model.destroy()`自定义转换?
当我使用主干的Javascript Backbone.js`model.destroy()`自定义转换?,javascript,jquery,backbone.js,marionette,Javascript,Jquery,Backbone.js,Marionette,当我使用主干的model.destroy()时,它似乎会自动从DOM中删除该视图 有没有一种方法可以让我使用destroy()发送删除请求,但自己从DOM中删除视图 比如: this.model.destroy({ 等等:是的, 成功:函数(){ $('#myElement')。设置动画({ “高度”:“0”, 1000, 函数(){$('#myElement').remove()} }); } });您需要在包含项视图()的集合视图中重写集合移除()。这是从集合中删除模型时调用的函数,也是破
model.destroy()
时,它似乎会自动从DOM中删除该视图
有没有一种方法可以让我使用destroy()
发送删除请求,但自己从DOM中删除视图
比如:
this.model.destroy({
等等:是的,
成功:函数(){
$('#myElement')。设置动画({
“高度”:“0”,
1000,
函数(){$('#myElement').remove()}
});
}
});代码>您需要在包含项视图()的集合视图中重写集合移除()
。这是从集合中删除模型时调用的函数,也是破坏视图的功能。具体地说,您选择如何覆盖它取决于您自己,但使用动画功能覆盖它可能是最容易的,可能遵循以下几点
_onCollectionRemove: function(model) {
var view = this.children.findByModel(model);
var that = this;
view.$('#myElement').animate({
"height" : "0",
1000,
function(){
that.removeChildView(view);
that.checkEmpty();
}
});
}
如果您希望在destroy
回调中手动处理视图的删除,只需重写\u onCollectionRemove()
以包含空函数,并在删除请求的回调中执行您想要的任何操作。不过,我建议使用上面描述的方法,而不是在destroy
回调中使用。完全消除该函数,然后在代码的其他地方处理它的职责,会干扰木偶的预期事件流。简单地用不同的UI效果覆盖函数可以保持自然流
编辑:另一个用户先前的回答(现在由于向下投票而被删除)建议在UI效果完成后调用
销毁
。由于OP指出的原因,这不是一个好方法-如果destroy
方法出现问题(例如,如果远程服务器停机),用户会觉得模型已被删除(UI效果已完成)即使无法访问服务器且模型仍然存在。您需要使用以下选项之一:
- 集合。删除模型
- collection.reset collection.model
使用js或jQuery直接从集合/组合视图中删除元素不是一个好做法 我们可以关注视图生命周期,而不是关注模型事件。为此,Marionette在Marionette.View(由所有Marionette视图扩展)上提供了
onbeforedstroy
回调。在ItemView中,您可以这样定义回调
onBeforeDestroy: function () {
$('#myElement').animate({ "height" : "0", 1000 });
}
这是一个重要的警告。由于$.animate
是一个异步函数,因此有可能在$.animate
完成转换之前删除视图。因此,我们必须在销毁之前对我们的进行修改
onBeforeDestroy: function () {
var animationDelay = 1000ms;
this.remove = _.delay(_.bind(this.remove, this), animationDelay );
this.$el.animate({ "height" : "0", animationDelay });
}
本质上,我们在这里所做的是将View.remove()
方法设置为在动画完成后激发,确保在调用this.remove
时,在动画完成后异步调用它。我想,您也可以通过承诺来实现这一点,但这需要更多的开销。前面提到的onbeforedstroy方法对我不起作用。它在主干中抛出错误(缺少删除方法)
我的解决方案具有相同的aproach,并且在itemView中运行良好
remove: function(){
this.$el.animate({"height" : "0"},500, function(){
$(this).remove();
});
},
您使用的是哪种视图?骨干?木偶CollectionView?项目视图?LayoutView?它不工作了吗?@Morslima-这是一个木偶物品View@Simo结束-正确。在jQuery事件触发之前,视图从DOM中删除。这正是我所需要的。我应该调查提线木偶是罪魁祸首。非常感谢。主干从UI中删除模型并立即触发'destroy'
事件,除非调用model.destroy时传递了等待===true
。(此触发器将依次对该模型的集合调用remove
)。换句话说,默认主干操作不是等待服务器。一般来说,只要监视和处理来自服务器的响应,在服务器返回之前从UI中删除视图本质上没有问题。我同意,但是,我不想重新呈现整个集合视图。我正在使用@morslima建议的方法;木偶网的view.removeChildView
方法,用于从DOM中实际删除元素。这也是非常有效的。谢谢你的意见!