Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Backbone.js 如何通过主干中的cid提取任何类?_Backbone.js - Fatal编程技术网

Backbone.js 如何通过主干中的cid提取任何类?

Backbone.js 如何通过主干中的cid提取任何类?,backbone.js,Backbone.js,在使用Backbone.js时,我注意到视图和模型都提供了CID。我知道,如果这些类是集合的一部分,我可以从中提取任何一个。在给定cid的情况下,是否可以使用主干将任何类拉到集合之外 例如,如果我有MyObject.Views.Tree=Backbone.View.extend({}),我可以从var Tree=new MyObject.Views.Tree()创建一个新的树视图。调用tree.cid返回一个特定的cid——类似于view231。是否有任何方法可以引用我的树视图,只要它的cid?

在使用Backbone.js时,我注意到视图和模型都提供了CID。我知道,如果这些类是集合的一部分,我可以从中提取任何一个。在给定cid的情况下,是否可以使用主干将任何类拉到集合之外

例如,如果我有
MyObject.Views.Tree=Backbone.View.extend({}),我可以从
var Tree=new MyObject.Views.Tree()创建一个新的树视图。调用
tree.cid
返回一个特定的cid——类似于
view231
。是否有任何方法可以引用我的树视图,只要它的cid?可能是全局主干.getByCid方法?

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


因此,如果您创建了一个对象,但没有在某个地方保留对它的引用(在集合中、在路由器中、在另一个对象中),它将变得不可访问,JavaScript虚拟机最终将对其进行垃圾收集。

ExtJS让我很恼火,我觉得有必要为主干重新创建类似的内容。也许这对你也有帮助?我没有对它进行太多的测试,但这是一个非常简单的更改。只是要小心创建很多东西,不要删除它们,否则会有一堆注册对象占用内存

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
Backbone.View.Registry={
项目:{},
寄存器:函数(id、对象){
this.items[id]=对象;
},
查找:函数(id){
返回此项。项[id]| |空;
},
删除:函数(id){
删除此项。项目[id];
}
}
Backbone.RegisteredView=Backbone.View.extend({
初始化:函数(){
Backbone.View.prototype.initialize.apply(这个);
this.cid=this.options.id | | this.cid;//以防万一您想要分配一个唯一的id并从中查找。
Backbone.View.Registry.register(this.cid,this);
},
删除:函数(){
主干。视图。原型。移除。应用(此);
Backbone.View.Registry.remove(this.cid);
归还这个;
}
});
test=Backbone.RegisteredView.extend({
初始化:函数(){
return$(“”);//只需为本例返回一些内容
}
});
div1=新测试({id:'header\u pane'});
div2=新测试();
日志(Backbone.View.Registry.items)//将包含标题窗格和基于cid的obj
ref=Backbone.View.Registry.lookup('header_pane');
控制台日志(ref)//将是标题窗格对象
div1.remove();
日志(Backbone.View.Registry.items)//将只包含基于cid的对象

啊,谢谢。我本来还希望有别的东西,但我得重新设计一下我的工作方式。再次感谢。