Backbone JS - 缓存视图实例

时间:2011-05-05 09:22:53

标签: javascript model-view-controller backbone.js

我正在编写一个BackboneJS应用程序,其中六个选项卡中的每一个都由他们自己的视图表示。我是否应该保存视图的实例,只要用户点击他已经去过的标签,就调用它render()函数?或者创建一个新实例并访问jQuery在第一次渲染过程中为我缓存的模板?

如果我执行后者,我仍然需要确保不通过我的JSON API获取另一个集合,因为这是在初始化某些视图期间完成的。

现在我将所有视图实例存储在我的控制器中,但我想知道这是否是内置的,或者有更好的选择。

干杯。

更新:这是我在我的控制器中使用的loadCachedView函数:

loadCachedView: function (name, view, collection){
    if (!this.views[name]){
        if (collection){
            this.collections[name] = new collection();
        }
        this.views[name] = new view({collection: this.collections[name]});
    } else {
        this.views[name].render();
    }
},

因此,在渲染视图时,我只需:this.loadCachedView('settings', SettingsView, SettingsCollcetion)

2 个答案:

答案 0 :(得分:3)

我通常会在控制器中跟踪所有观看内容。然后,控制器根据导航事件在可用视图之间切换:

var Switches;
Switches = [];
Skepic.SwitchView = Backbone.View.extend({
    hide: function() {
        return this.el.detach();
    },
    show: function() {
        if (!_.include(Switches, this)) {
            Switches.push(this);
        }
        _.each(Switches, function(s) {
            return s.hide();
        });
        this.container().append(this.el);
        return $('html, body').animate({
            scrollTop: 0
        }, 'fast', "linear");
    },
    container: function() {
        if (this.options.container) {
            return this.options.container;
        } else {
            return $("body > .content");
        }
    }
});

这是在一个视图和另一个视图之间切换的基本视图。控制器将创建视图(根据需要获取数据),当您切换时,您可以在视图中的覆盖show()函数中进行最后一次检查。

(注意我在jQuery上使用detach仍然让事件委托工作)

答案 1 :(得分:1)

你不能在这里使用.memoize函数吗?