如何通过Backbone中的cid拉出任何类?

时间:2011-08-26 15:42:19

标签: backbone.js

在使用Backbone.js时,我注意到两个视图和模型都给出了cid。我知道如果这些类是集合的一部分,我可以通过collection.getByCid来提取它们。是否可以使用Backbone来提取任何类在集合之外,给出它的cid?

例如,如果我有MyObject.Views.Tree = Backbone.View.extend({ });,我可以从var tree = new MyObject.Views.Tree();创建一个新的树视图。调用tree.cid会返回特定的cid - 类似于view231。有没有办法只给出它的cid引用我的树视图?一个全局的Backbone.getByCid方法,也许?

2 个答案:

答案 0 :(得分:7)

ExtJS宠坏了我,我觉得有必要为Backbone重新创建类似的东西。也许这对你有帮助吗?我没有测试太多,但这是一个非常简单的改变。只是要小心创建很多东西而不是删除它们,否则你会有一堆注册的对象占用内存。

Backbone.View.Registry = {
    items: {},
    register: function (id, object) {
        this.items[id] = object;
    },
    lookup: function (id) {
        return this.items[id] || null;
    },
    remove: function (id) {
        delete this.items[id];
    }
}

Backbone.RegisteredView = Backbone.View.extend({
    initialize: function () {
        Backbone.View.prototype.initialize.apply(this);
        this.cid = this.options.id || this.cid; //just in case you want to assign a unique ID and lookup from that.
        Backbone.View.Registry.register(this.cid, this);
    },
    remove: function () {
        Backbone.View.prototype.remove.apply(this);
        Backbone.View.Registry.remove(this.cid);
                    return this;
    }
});

test = Backbone.RegisteredView.extend({
    intialize: function () {
        return $("<div></div>"); //Just return something for this example
    }
});

div1 = new test({id: 'header_pane'});

div2 = new test();

console.log(Backbone.View.Registry.items); //Will have the header_pane and a cid based obj in it

    ref = Backbone.View.Registry.lookup('header_pane');
    console.log(ref); //Will be the header_pane object

div1.remove();

console.log(Backbone.View.Registry.items); //Will only have the cid based object in it

答案 1 :(得分:6)

没有

我认为你对骨干编程模型以及一般的JavaScript有一点误解。 Backbone无法跟踪您创建的内容;它只能帮助您创建具有特定原型(模型,集合等)的对象。它根本不关心你用它们做什么。 CID只是一种可用于索引和交叉引用的便捷方法,但您必须自己编写索引和交叉引用。

因此,如果您创建一个对象并且不在某处(在集合中,在您的路由器中,在另一个对象中)保持对它的引用,那么它将变得无法访问,并且JavaScript VM最终将垃圾收集它。