【问题标题】:How do I get rid of model attached to view after using Backbone's model#destroy?使用 Backbone 的模型#destroy 后,如何摆脱附加到视图的模型?
【发布时间】:2016-06-02 00:30:51
【问题描述】:

我看到了成功回调,但在调试器 Chrome 开发工具中,当我输入 this.model 时,我仍然看到模型。我知道它在服务器端被破坏了,但你能解释一下为什么它仍然附加到视图上吗?我该如何摆脱它?

        delete: function () {
            this.model.destroy({success: function () {console.log("success in destroy");}});
            debugger;
        }

【问题讨论】:

  • 我认为这就是它的工作方式。我查看了 Backbone 源代码,它显示 destroy 向服务器发送了一个 DELETE 请求,并从它所侦听的所有对象中注销了模型。我没有看到任何关于将模型对象归零的信息。

标签: javascript backbone.js view destroy


【解决方案1】:

你看到的是正确的。查看the documentation on model.destroy(或查看the code)我们可以看到它基本上做了两件事:

  • HTTP 删除模型的服务器表示
  • 从任何包含的集合中删除模型

请注意,模型本身或模型可能附加到的任何对象都不会发生任何事情。

我们可以通过一个简单的例子看到这种行为:

var foo = new Backbone.Model({foo: 'bar'});
var foos = new Backbone.Collection([foo]);
var fooView = new Backbone.View();
fooView.model = foo;

foo.destroy({success: function () {
    console.log('success');
}});

console.log(foo, foos, fooView);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone.js"></script>

请注意,在执行此代码后,foofooView.model 没有任何反应,尽管 foos 不再包含 foo 的实例。

删除 view.model

如果您想从视图中移除模型,您可以利用成功回调。只需将视图的 delete 方法(来自您的问题)更改为如下所示:

delete: function () {
    this.model.destroy({success: function () {
        delete this.model;
    }.bind(this)});
}

另外,由于我们从文档中知道模型将触发 "destroy" 事件,我们也可以监听该事件并触发删除我们模型的回调。

【讨论】:

  • 我没有看到具有删除方法的视图 - 这是您刚刚创建并计划作为模型销毁的回调附加的东西吗?
  • 是的。我是基于您问题中的delete 方法。
猜你喜欢
  • 2013-10-30
  • 2012-01-25
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多