【问题标题】:How to disable cache view in Durandal如何在 Durandal 中禁用缓存视图
【发布时间】:2014-03-28 18:18:38
【问题描述】:

我有一个视图模型:

define(['knockout'], function (ko) {
        var self, albumWrapper;

        albumWrapper = function () {
            self = this;

            // get album name from url parameter
            var albumName = routerWrapper.router.activeInstruction().params[0];
            self.retrieveAlbum(albumName);
        };

        albumWrapper.prototype = {
            retrieveAlbum: function (name) {
                /* do something to retrieve data */
            }
        }

        return new albumWrapper();
    });

我通过这个 url 配置路由去这个视图:#gallery/album/:name

但是当参数(/:name)被这段代码改变时:

window.location.href = '#gallery/album/' + data.name();

这个视图模型只是第一次出现,所以我无法检索任何新专辑。我认为这个问题是因为缓存视图,但我不确定。 请帮我解决这个问题。在这种情况下,我使用 durandal。

【问题讨论】:

    标签: javascript browser-cache durandal router


    【解决方案1】:

    我认为您的问题不是缓存,我认为这与您设置视图模型的方式有关。据我所知,durandal 将第一次解析您的视图并使用您上面的代码来创建视图模型。返回 new albumWrapper() 将导致您的视图模型成为单例。构造函数只会在第一次被调用,并且永远不会再被调用。您可以尝试在 albumWrapper() 之前删除 new 关键字以返回函数而不是它的新实例。这样,durandal 每次都会创建一个新的视图模型,这应该会导致构造函数中的代码每次都运行。尽管更好的方法可能是使用激活功能并让模块生命周期为您工作。请参阅以下更改:

    define(['knockout'], function (ko) {
        var self, albumWrapper;
    
        albumWrapper = function () {
            var self = this;
    
            self.CurrentAlbum = ko.observable();
        };
    
        albumWrapper.prototype = {
            retrieveAlbum: function (name) {
                /* do something to retrieve data */
            },
            activate: function(name) {
                var self = this;    
                var selectedAlbum = self.retrieveAlbum(name);
                self.CurrentAlbum(selectedAlbum);
            }
        }
    
        return albumWrapper();
    });
    

    现在 durandal 应该获得一个视图实例,但每次请求路由时都会使用任何路由参数调用激活函数。还添加了一个名为 Current Album 的可观察字段,您可以将视图元素绑定到该字段。离开路线并不会导致视图实例像网页一样从内存中删除,它只是坐在那里直到您下次再次导航到路线时,更像是桌面应用程序交换屏幕。每次导航都会调用 activate 函数,让您可以在路线上设置新专辑名称的视图。假设retrieveAlbum 函数返回一个具有名称、日期、艺术家等属性的专辑对象,您可以将其设置为Current Album observable 的值,这将自动更新您视图上的元素。在此处查看有关路由和视图生命周期的文档:

    http://durandaljs.com/documentation/Using-The-Router.html

    http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks.html

    【讨论】:

    • 如果路由没有像 #gallery/album 这样配置参数,似乎 activate 功能不起作用。我们可以让它在这种情况下工作吗?
    • 对不起,当它在模板视图模型绑定中时它不起作用。
    • 要让#gallery/album 工作,您需要为您的模块定义多个路由: router.map([{ route: ['gallery/album/:name', 'gallery/album/:name '],moduleId:'私人/仪表板',标题:'仪表板'}])。您可以为路由属性传递一个数组。至于“模板视图模型绑定”,我不确定你指的是什么,你能用一个例子解释一下吗?
    • 那么,如何禁用缓存?
    • @pilavdzice 好吧,这取决于,您可以在 require js 上使用option 将查询字符串附加到它加载的所有脚本,以强制浏览器获取您的 js 文件的新副本。或者你可以让你的models return a function 充当工厂而不是返回一个对象并成为一个单身人士
    【解决方案2】:

    为可能正在寻找如何禁用 durandal 缓存的其他人发布此内容。

    您可以在模块中将 cacheViews 设置为 false 以停止缓存,例如这个单例模块:

    var vm = {};
    vm.cacheViews = false;
    return vm;
    

    或者在上面的例子中:

        albumWrapper = function () {
            self = this;
            self.cacheViews = false;
            // get album name from url parameter
            var albumName = routerWrapper.router.activeInstruction().params[0];
            self.retrieveAlbum(albumName);
        };
    

    【讨论】:

    • 确实可以,但是如果您担心迁移到 Durandal 的下一个版本(Angular 上的 2.0),那么您希望避免使用单例对象模块并改用函数模块。见Rob's blog post
    猜你喜欢
    • 2016-05-30
    • 2014-11-06
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2012-10-15
    • 2011-04-12
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多