如何在 Durandal 中调用全局函数来更改路由?
How to call global function on route change within Durandal?
给定我们的 Durandal
应用程序的以下场景:
当客户访问我们 SPA
的某些 URL 时,我们想向他赠送一个 dialog/pop-up。对于初始加载,这不是问题,我们从 shell.js
中的 activate
回调函数中调用一个函数。
问题是当用户浏览我们的网站并到达某个 URL 应该弹出对话框的位置时。
假设我们有两个视图模型 product
和 prodcutOverview
以及 shell
。这三个都会有一个像这样的 activate
函数:
vm.activate = function () {
var keywordsExists = checkUrl();
if(keywordsExists){
globals.showDialog();
}
};
globals
的思路来源于此question
如何创建一个用于每次路由更改的激活函数,以防止我的视图模型上出现重复代码?
您可以在 Durandal 中使用 Pub/Sub 系统。在你的 shell.js
中有一个方法,其唯一目的是显示你需要的对话框,然后订阅消息 <your_message_name>
,然后在你希望对话框显示的每个地方,发布消息 <your_message_name>
.
使用相同技术的另一个想法是发布一条消息,说明 url 应用程序正在访问什么,然后在订阅者上确定何时显示对话框。这样,确定何时显示对话框的所有逻辑都在一个地方,而不是遍布整个应用程序。
您可以将通用激活函数创建为 require 模块,然后以这种方式重用它。
define('common-activate', ['globals'], function(globals){
function checkUrl(){
//checks url
}
var activate = function(){
var keywordsExists = checkUrl();
if(keywordsExists){
globals.showDialog();
}
return activate;
}
define('products', ['common-activate'], function(activate){
return {
activate: activate
};
}
define('productOverview', ['common-activate'], function(activate){
return {
activate: activate
};
}
给定我们的 Durandal
应用程序的以下场景:
当客户访问我们 SPA
的某些 URL 时,我们想向他赠送一个 dialog/pop-up。对于初始加载,这不是问题,我们从 shell.js
中的 activate
回调函数中调用一个函数。
问题是当用户浏览我们的网站并到达某个 URL 应该弹出对话框的位置时。
假设我们有两个视图模型 product
和 prodcutOverview
以及 shell
。这三个都会有一个像这样的 activate
函数:
vm.activate = function () {
var keywordsExists = checkUrl();
if(keywordsExists){
globals.showDialog();
}
};
globals
的思路来源于此question
如何创建一个用于每次路由更改的激活函数,以防止我的视图模型上出现重复代码?
您可以在 Durandal 中使用 Pub/Sub 系统。在你的 shell.js
中有一个方法,其唯一目的是显示你需要的对话框,然后订阅消息 <your_message_name>
,然后在你希望对话框显示的每个地方,发布消息 <your_message_name>
.
使用相同技术的另一个想法是发布一条消息,说明 url 应用程序正在访问什么,然后在订阅者上确定何时显示对话框。这样,确定何时显示对话框的所有逻辑都在一个地方,而不是遍布整个应用程序。
您可以将通用激活函数创建为 require 模块,然后以这种方式重用它。
define('common-activate', ['globals'], function(globals){
function checkUrl(){
//checks url
}
var activate = function(){
var keywordsExists = checkUrl();
if(keywordsExists){
globals.showDialog();
}
return activate;
}
define('products', ['common-activate'], function(activate){
return {
activate: activate
};
}
define('productOverview', ['common-activate'], function(activate){
return {
activate: activate
};
}