您可以通过覆盖路由器进程的默认行为来设置标题来实现这一点。
导航完成后始终设置标题,因此之前已调用视图模型的激活方法。Durandal 2.0 中的当前实现是:
router.updateDocumentTitle = function(instance, instruction) {
if (instruction.config.title) {
if (app.title) {
document.title = instruction.config.title + " | " + app.title;
} else {
document.title = instruction.config.title;
}
} else if (app.title) {
document.title = app.title;
}
};
这completeNavigation
在router.js
.
在instance
param 中,您拥有要激活的 ViewModel,因此可能的解决方案是覆盖其中的updateDocumentTilte
函数,shell.js
或者main.js
使用instance
来获取您想要的值。例如你可以做这样的事情(确保你有app
和router
实例):
router.updateDocumentTitle = function (instance, instruction) {
if (instance.setTitle)
document.title = instance.setTitle();
else if (instruction.config.title) {
if (app.title) {
document.title = instruction.config.title + " | " + app.title;
} else {
document.title = instruction.config.title;
}
} else if (app.title) {
document.title = app.title;
}
};
在这段代码中,我们检查实例(当前 ViewModel)是否包含一个方法setTitle
,如果是,那么我们得到调用该函数的标题。然后在我们的视图模型中,我们可以有类似的东西:
define(function () {
var id;
var vm = {
activate: function (param) {
id = param;
return true;
},
setTitle: function () {
return 'My new Title ' + id; //Or whatever you want to return
}
};
return vm;
});
如果您的视图模型不包含此方法,那么它应该属于当前行为。