2015-05-14 69 views
1

考慮以下情形我們Durandal應用:如何在Durandal中調用路線變更的全局功能?

當客戶訪問我們的SPA的某些URL的,我們想提出他的對話/彈出。對於初始加載,這不是問題,我們在shell.js中調用activate回調函數中的函數。

問題是,當用戶瀏覽我們的網站,並達到一個URL,彈出對話框。

假設我們有兩個視圖模型productprodcutOverviewshell。所有這三個將有activate功能是這樣的:

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

globals想法來源於此question

如何創建一個激活功能在處理每個路由變化使用,所以我防止重複碼我的viewmodels?

回答

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

您可以使用Durandal中的發佈/訂閱系統。在您的shell.js中有一個方法,其唯一目的是顯示您需要的對話框,然後訂閱郵件<your_message_name>,然後在您希望對話框顯示的每個地方發佈消息<your_message_name>

使用相同技術的另一個想法是發佈應用正在訪問的URL的消息,然後在訂閱者確定何時顯示對話。這樣,確定何時顯示對話框的所有邏輯都在一個地方,而不是遍佈整個應用程序。