【问题标题】:Backbone: clear all data from memoryBackbone:清除内存中的所有数据
【发布时间】:2013-04-15 00:19:19
【问题描述】:

我有一个菜单,点击后会创建主干视图并绑定控件。每次我点击菜单时都会发生这种情况。我需要知道的是在定义和渲染视图之前(在每次菜单单击时)如何从内存中清除骨干对象。

否则,每次单击菜单时,主干都会创建一个新视图并重新绑定所有控件。所以我得到这样的东西:

r {cid: "view1", options: Object, $el: b.fn.b.init[1], el: div#templatePlaceholder, constructor: function…}
r {cid: "view2", options: Object, $el: b.fn.b.init[1], el: div#templatePlaceholder, constructor: function…}
r {cid: "view3", options: Object, $el: b.fn.b.init[1], el: div#templatePlaceholder, constructor: function…}

注意:DOM 只显示一个渲染

编辑: 代码:

            var app = {
                Collection: Backbone.Collection.extend({}),
                Model: Backbone.Model.extend({}),
                View: Backbone.View.extend({
                    initialize: function(){
                        this.setElement($('#templatePlaceholder'));
                    },
                    render: function () {
                        var that = this;
                        Q.when(formDataGet.execute()).then(function (data) {
                            that.$el.html(data);
                       });
                    },
                    events: {
                        "click button[id=lbtn]": "goLeft",
                        "click button[id=rbtn]": "goRight"  
                    },

                    goLeft: function () {
                        // Button clicked
                        console.log(this);
                    },
                    goRight: function () {
                        // Button clicked
                        console.log(this);
                    }

                }),

            };


            var view = new app.View({
            });

            view.render();

每次单击菜单项时都会触发此代码。 这创造了一个新的观点。

【问题讨论】:

  • 我正在做一些非常基本的事情。只要将视图对象传递给 remove(),我就可以删除视图。但是当我单击我的菜单时,它无法知道视图对象是什么。也许我可以按 ID 删除视图。那会有所帮助。但如果我可以删除主干范围之外的所有主干视图,那将是最好的。

标签: backbone.js view destroy


【解决方案1】:

我可以在核心骨干中想到两种方式(可能还有更多,但这是一个开始)

  1. 保持对视图的引用,当需要关闭菜单时,在视图上调用remove()

  2. 您不必删除视图,您可以简单地显示/隐藏它,没有任何问题

  3. 使用 Marrionette / Chappline / LayoutManager 有一些结构化的方式来维护您的视图

有关您的应用/结构的更多信息以及哪些用例可以让我提供更多帮助

【讨论】:

  • 感谢 Eran,我不会关闭与骨干的观点。我的应用程序不是骨干应用程序。实际上,我正在使用 Durandal 在视图之间进行路由,在其中一个页面中,我有一个树视图。这个树视图(onclick),调用上面的脚本来创建主干模型等并渲染视图。每次单击树视图节点时,都会再次运行整个主干脚本并创建新模型并加载新视图。所以我没有管理主干中每个主干模型/视图实例的生命周期。我需要一种从主干上下文外部破坏主干的方法。
  • 到目前为止,我已经通过使用 jquery.unbind() 成功解除绑定。如果我还可以找到一种在每次树视图单击时从内存中删除所有主干对象的方法,那将是理想的
  • backbone 没有“清除所有”方法,这取决于您,您需要有一个保存视图实例的对象(例如元素上的数据属性,有点难看,但让我们忽略它)然后在每个视图上调用 .remove() ,然后如果你希望它被垃圾收集,你需要删除对该视图的引用,或者通过删除数据属性,或者如果它在一个对象中做一个delete viewholder.view1 等...这是主干方式,检查木偶/布局管理器(或使用 jstree 并忘记在主干中执行此操作;))
  • 谢谢Eran,我会试试木偶
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
相关资源
最近更新 更多