要求: 我想找到用于开发现有页面的所有主干视图(src文件路径)。在我们的例子中,每个后视图将保存在一个单独的js文件中。简而言之,我想找到js文件路径(扩展Backbone视图的视图)。
我尝试过: 我的情况下,我们有一个包装视图,它扩展了Backbone视图,所有视图都将扩展包装器视图。所以在包装器视图的初始化方法中,我生成错误以获取调用堆栈,并且我能够找到js-file-paths。
var WrapperView = Backbone.View.extend({
initialize: function() {
this.track();
},
track : function() {
try{
throw new Error("STACK");
}
catch(e){
this.$el.attr('view-url', e.stack.match(/\bhttps?:\/\/.*js*(?=(?:(?!http)[\s\S])*https?:\/\/\S*backbone-min\.js)/)[0]);
}
if(Object.observe){
Object.observe(this, function(changes){
var eleProp = _.filter(changes, function(prop){ return prop.name == "$el"; })[0];
if(!eleProp) return;
eleProp.object.$el.attr('view-url', j$(eleProp.oldValue).attr('view-url'));
}, ["update"])
}
}
});
var ChildView = WrapperView.extend({
initialize: function() {
WrapperView.prototype.initialize.apply(this);
this.track();
}
});
Backbone将调用------> ChildView.initialize --------> WrapperView.initialize();
由于ChildView.initialize函数调用在调用堆栈中,我可以获取文件路径。
我想要的: 虽然以上解决方案正在运行,但我不想在WrapperView中包含我的跟踪逻辑,因为它可能无法保证所有子视图都会调用WrapperView.prototype.initialize并且我不想触摸框架src。所以为了解决这个问题,我在Backbone.View(Js插件)本身中包含了跟踪逻辑,而不是WrapperView。
(function(){
var _viewExtend = Backbone.View.extend;
var newExtend = function (protoProps, classProps) {
var _init = protoProps.initialize;
var newInit = function(){
try{
throw new Error("STACK");
}
catch(e){
this.$el.attr('view-url', e.stack.match(/\bhttps?:\/\/.*js*(?=(?:(?!http)[\s\S])*https?:\/\/\S*backbone-min\.js)/)[0]);
}
if(Object.observe){
Object.observe(this, function(changes){
var eleProp = _.filter(changes, function(prop){ return prop.name == "$el"; })[0];
if(!eleProp) return;
eleProp.object.$el.attr('view-url', j$(eleProp.oldValue).attr('view-url'));
}, ["update"]);
}
return _init.apply(this, arguments);
};
protoProps.initialize = newInit;
return _viewExtend.call(this, protoProps, classProps);
};
Backbone.View.extend = newExtend;
})();
但是调用堆栈不包含子视图文件路径,因为没有从子视图调用,所以请帮我找到完成任务的方法。
Backbone将调用------> newInit(此处生成的堆栈)--------> Childview.initialize();
注意:如果有任何其他方法可以达到要求,请告诉我。