3

此示例借自 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] (点击上面的链接到代码中的确切位置)如果(据我所知)之前没有被初始化?如果我不准确,请在评论中写下。

4

1 回答 1

5

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

存储在数组view中的任意值也是如此。views然后,我们尝试找到具有window与 的值匹配的标识符的属性view。如果view === "james"我们正在寻找window.james.

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

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

ContactView的属性也是如此window,我们可以templateLoader.load像下面这样调用来加载该模板:

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

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

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

于 2012-07-15T12:34:09.037 回答