Backbone.js 如何通过主干中的cid提取任何类?
在使用Backbone.js时,我注意到视图和模型都提供了CID。我知道,如果这些类是集合的一部分,我可以从中提取任何一个。在给定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?
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的对象
啊,谢谢。我本来还希望有别的东西,但我得重新设计一下我的工作方式。再次感谢。