如何在 Durandal 中调用全局函数来更改路由?

How to call global function on route change within Durandal?

给定我们的 Durandal 应用程序的以下场景:

当客户访问我们 SPA 的某些 URL 时,我们想向他赠送一个 dialog/pop-up。对于初始加载,这不是问题,我们从 shell.js 中的 activate 回调函数中调用一个函数。

问题是当用户浏览我们的网站并到达某个 URL 应该弹出对话框的位置时。

假设我们有两个视图模型 productprodcutOverview 以及 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
   };
}