Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js`model.destroy()`自定义转换?_Javascript_Jquery_Backbone.js_Marionette - Fatal编程技术网

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中实际删除元素。这也是非常有效的。谢谢你的意见!