【问题标题】:BackboneJS - cacheing view instancesBackbone JS - 缓存视图实例
【发布时间】:2011-05-05 09:22:53
【问题描述】:

我正在编写一个 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)

【问题讨论】:

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


    【解决方案1】:

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

    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 以使事件委托仍然有效)

    【讨论】:

    • 我需要将 this.el.detach() 更改为 $(this.el).detach() 才能使代码正常工作。否则我有类似的要求,这是我遇到的最佳解决方案。
    • 所以这确实意味着您使用 loadCachedView 或类似方法(保存视图的实例并调用它的 show() 函数)做与我相同的操作?
    • 我猜是的。但它从不隐藏的dom中删除。
    • 您也可以粘贴您的控制器吗?为了使show() 工作,您需要单独缓存实例,对吗?然后重新使用该实例并将其称为show 函数。
    • 这不是缓存,这是引用一个对象,是的,您需要保留对它的引用才能显示/隐藏它。
    【解决方案2】:

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

    【讨论】:

    • @Jonatan _.memoize 这是一个带有下划线的内置缓存功能。
    • 啊,我只查看了 Backbone 的文档。另外我认为他拼错了“记忆”:-)
    • 我想它也可以与 _.memoize 一起使用 .. 想法是将您的标签内容保存在内存中,如果没有必要则不要重新加载它们......它让我发现了这个很酷的功能 :)
    • 我是她,而且,这不是记住 - 我也想了很长时间。它在许多 js 库中不断出现,所以我只能认为它是一个糟糕的 l33t 语言范式,现在已经横行。 Memoize 应该可以帮到你。
    • memoize 不能与 memorize 混淆 :) en.wikipedia.org/wiki/Memoization
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 2013-01-15
    相关资源
    最近更新 更多