我有一个视图模型:
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();
});
我配置的路由通过这个网址去这样的观点: #gallery/album/:name
但是,当参数(/:name)
这段代码更改:
window.location.href = '#gallery/album/' + data.name();
该视图模型只是发生一次,所以我不能获取任何新专辑的时候。 我想是因为缓存鉴于这个问题,但我不能肯定。 请帮我解决这个问题。 我在这种情况下使用迪朗达尔。
我不认为你的问题是缓存,我认为这与你的方式设置您的视图模式去做。 从我所看到的,迪朗达尔是要解决您的视图中的第一时间,使用上面的代码来创建视图模型。 回到新albumWrapper()将导致您的视图模型是一个单例。 构造函数只会被称为在第一时间与永远不再。 你可以尝试删除albumWrapper()之前,新的关键字返回功能,而不是它的一个新的实例。 这样迪朗达尔将创建每次运行以及每一个应该引起在构造函数代码的时间一个新的视图模型。 虽然一个更好的办法可能是使用了激活功能,让模块寿命周期为你工作。 请参见下面的变化:
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();
});
现在迪朗达尔应该把你的观点的一个实例,但每次请求的路径时调用激活功能与任何路由参数。 此外加入了称为当前专辑可观察到的领域,你可以绑定您的视图元素。 从路线导航离开不会导致从类似网页存储器删除视图的情况下,它只是坐在那里,直到你导航到路线再接下来的时间,更像是一个桌面应用程序交易出去的屏幕。 该激活函数被调用每导航,并允许您设置的路线上新专辑名称的视图。 假设retrieveAlbum函数返回,如姓名,日期,艺术家等性质的专辑对象,你可以设置为当前专辑观察到的价值,这将automatigically更新您的视图的元素。 检查出的路由,这里的景色生命周期的文档:
http://durandaljs.com/documentation/Using-The-Router.html
http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks.html
发布这对于其他人可能会寻找如何禁用迪朗达尔缓存。
您可以在模块中设置cacheViews假像这样停止缓存,这样的单模块:
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);
};