如何在Durandal内调用路线变换的全局功能?

时间:2015-05-14 13:59:29

标签: single-page-application durandal-2.0

给出Durandal应用程序的以下场景:

当客户访问我们SPA的某些网址时,我们希望向他提供一个对话框/弹出窗口。对于初始加载,这不是问题,我们从activate中的shell.js回调函数调用函数。

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

我们说两个视图模型productprodcutOverview以及shell。这三个都有activate函数,如下所示:

vm.activate = function () {
    var keywordsExists = checkUrl();
    if(keywordsExists){
       globals.showDialog();
    }
};

globals的想法来自此question

如何创建一个在每次路径更改时使用的激活功能,以防止我的视图模型上的重复代码?

2 个答案:

答案 0 :(得分:2)

您可以将公共激活功能创建为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
   };
}

答案 1 :(得分:1)

您可以使用Durandal中的发布/订阅系统。在shell.js中有一个方法,其唯一目的是显示您需要的对话框,然后订阅消息<your_message_name>,然后在您希望对话框显示的每个位置,发布消息<your_message_name>

使用相同技术的另一个想法是发布应用正在访问的URL的消息,然后在订阅者上确定何时显示对话框。这样,确定何时显示对话框的所有逻辑都在一个地方而不是遍布整个应用程序。