如何在运行时获取javascript文件路径

时间:2015-09-24 04:55:08

标签: javascript backbone.js callback callstack

要求: 我想找到用于开发现有页面的所有主干视图(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();

注意:如果有任何其他方法可以达到要求,请告诉我。

0 个答案:

没有答案