Backbone.js `model.destroy()` 自定义过渡?
Backbone.js `model.destroy()` custom transitions?
当我使用 Backbone 的 model.destroy()
时,它似乎会自动从 DOM 中删除该视图。
有没有办法让我使用 destroy()
发送 DELETE 请求,但自己从 DOM 中删除视图?
类似于:
this.model.destroy({
wait: true,
success: function(){
$('#myElement').animate({
"height" : "0",
1000,
function(){$('#myElement').remove()}
});
}
});
您需要在包含项目视图 (documentation) 的集合视图中覆盖 _onCollectionRemove()
。这是从集合中删除模型时调用的函数,也是破坏视图的函数。具体如何选择覆盖它取决于你,但用你的动画功能覆盖它可能是最简单的,可能沿着以下几行...
_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
回调中手动处理视图的删除,只需重写 _onCollectionRemove()
以包含一个空函数并在删除的回调中执行任何您想做的事情要求。不过,我推荐我上面描述的方法,而不是在 destroy
回调中执行。完全消除该功能然后在代码中的其他地方处理它的职责会干扰 Marionette 的预期事件流。只需用不同的 UI 效果覆盖该函数即可保持自然流动。
编辑:另一个用户之前的回答(现在由于投票被删除而被删除)建议在 UI 效果完成后调用 destroy
可能是明智的完全的。由于 OP 指出的原因,这不是一个好方法 - 如果 destroy
方法出现问题(例如,如果远程服务器出现故障),在用户看来好像模型已被删除( UI 效果已经完成)即使服务器无法访问并且模型仍然存在。
您需要使用其中之一:
- collection.remove 模特
- collection.reset collection.model
每个方法都会重新呈现您的集合或复合视图。
使用 js 或 jQuery;
直接从 collection/composite 视图中删除元素不是好的做法
我们可以关注视图生命周期,而不是关注模型事件。为此,Marionette 使 onBeforeDestroy
回调在 Marionette.View 上可用(由所有 Marionette 视图扩展)。在您的 ItemView 中,您将像这样定义回调
onBeforeDestroy: function () {
$('#myElement').animate({ "height" : "0", 1000 });
}
他们在这里是一个重要的警告。由于 $.animate
是一个异步函数,因此可能会在 $.animate
完成转换之前删除视图。因此,我们必须对 onBeforeDestroy
.
进行修改
onBeforeDestroy: function () {
var animationDelay = 1000ms;
this.remove = _.delay(_.bind(this.remove, this), animationDelay );
this.$el.animate({ "height" : "0", animationDelay });
}
本质上,我们在这里所做的是将 View.remove()
方法设置为在动画 运行 完成后触发,确保在调用 this.remove
时,它是异步调用的,在动画已 运行 完成。我想您也可以使用 Promises 来做到这一点,但这需要更多的开销。
提到的 onBeforeDestroy 方法对我不起作用。它在 backbone 中抛出错误(删除方法缺失)
我的解决方案具有相同的方法并且在 itemView
中运行良好
remove: function(){
this.$el.animate({"height" : "0"},500, function(){
$(this).remove();
});
},
当我使用 Backbone 的 model.destroy()
时,它似乎会自动从 DOM 中删除该视图。
有没有办法让我使用 destroy()
发送 DELETE 请求,但自己从 DOM 中删除视图?
类似于:
this.model.destroy({
wait: true,
success: function(){
$('#myElement').animate({
"height" : "0",
1000,
function(){$('#myElement').remove()}
});
}
});
您需要在包含项目视图 (documentation) 的集合视图中覆盖 _onCollectionRemove()
。这是从集合中删除模型时调用的函数,也是破坏视图的函数。具体如何选择覆盖它取决于你,但用你的动画功能覆盖它可能是最简单的,可能沿着以下几行...
_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
回调中手动处理视图的删除,只需重写 _onCollectionRemove()
以包含一个空函数并在删除的回调中执行任何您想做的事情要求。不过,我推荐我上面描述的方法,而不是在 destroy
回调中执行。完全消除该功能然后在代码中的其他地方处理它的职责会干扰 Marionette 的预期事件流。只需用不同的 UI 效果覆盖该函数即可保持自然流动。
编辑:另一个用户之前的回答(现在由于投票被删除而被删除)建议在 UI 效果完成后调用 destroy
可能是明智的完全的。由于 OP 指出的原因,这不是一个好方法 - 如果 destroy
方法出现问题(例如,如果远程服务器出现故障),在用户看来好像模型已被删除( UI 效果已经完成)即使服务器无法访问并且模型仍然存在。
您需要使用其中之一:
- collection.remove 模特
- collection.reset collection.model
每个方法都会重新呈现您的集合或复合视图。
使用 js 或 jQuery;
直接从 collection/composite 视图中删除元素不是好的做法我们可以关注视图生命周期,而不是关注模型事件。为此,Marionette 使 onBeforeDestroy
回调在 Marionette.View 上可用(由所有 Marionette 视图扩展)。在您的 ItemView 中,您将像这样定义回调
onBeforeDestroy: function () {
$('#myElement').animate({ "height" : "0", 1000 });
}
他们在这里是一个重要的警告。由于 $.animate
是一个异步函数,因此可能会在 $.animate
完成转换之前删除视图。因此,我们必须对 onBeforeDestroy
.
onBeforeDestroy: function () {
var animationDelay = 1000ms;
this.remove = _.delay(_.bind(this.remove, this), animationDelay );
this.$el.animate({ "height" : "0", animationDelay });
}
本质上,我们在这里所做的是将 View.remove()
方法设置为在动画 运行 完成后触发,确保在调用 this.remove
时,它是异步调用的,在动画已 运行 完成。我想您也可以使用 Promises 来做到这一点,但这需要更多的开销。
提到的 onBeforeDestroy 方法对我不起作用。它在 backbone 中抛出错误(删除方法缺失) 我的解决方案具有相同的方法并且在 itemView
中运行良好remove: function(){
this.$el.animate({"height" : "0"},500, function(){
$(this).remove();
});
},