【问题标题】:How can you reference to javascript window element before initianization?在初始化之前如何引用 javascript 窗口元素?
【发布时间】:2012-07-15 12:19:25
【问题描述】:

这个例子是从 Backbone 目录演示应用中借来的 https://github.com/ccoenraets/backbone-directory/blob/master/web/js/utils.js#L11

// The Template Loader. Used to asynchronously load templates located in separate .html files
window.templateLoader = {

    load: function(views, callback) {

        var deferreds = [];

        $.each(views, function(index, view) {
            if (window[view]) {
                deferreds.push($.get('tpl/' + view + '.html', function(data) {
                    window[view].prototype.template = _.template(data);
                }, 'html'));
            } else {
                alert(view + " not found");
            }
        });

        $.when.apply(null, deferreds).done(callback);
    }  
};

您使用字符串数组 [views] 和 [callback] 函数对其进行初始化。

我的问题是如何检查 window[view](点击上面的链接到代码中的确切位置)如果(据我所知)之前没有被初始化?如果我不准确,请在 cmets 中写下。

【问题讨论】:

    标签: javascript backbone.js backbone-views


    【解决方案1】:

    如果我正确理解了您的问题,那么当您调用 templateLoader.load 时,您会传入 2 个参数; viewscallback。我们可以假设views 是一个数组,因为我们随后使用jQuery 的.each() 方法遍历该数组。对.each() 的回调传递了与当前迭代相对应的views 数组的元素。该参数被命名为view

    所以view 是存储在views 数组中的任意值。然后,我们尝试使用与view 的值匹配的标识符来查找window 的属性。如果view === "james" 我们正在寻找window.james

    如果您查看该应用程序中的某些视图,您会发现它们的定义如下:

    window.ContactView = Backbone.View.extend({
        // Some methods
    });
    

    所以ContactViewwindow 的一个属性,我们可以像下面这样调用templateLoader.load 来加载该模板:

    templateLoader.load(["ContactView"], someCallbackFn);
    

    您可以在main.js 中看到实际调用的位置。

    所以实际发生的是window 的一堆属性在各种其他文件中定义,然后由模板加载器通过向其传递一组标识符来加载。

    【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多