2

假設我有2個控制器處理頁面的兩部分 - 頁眉和頁面內容。大多數操作發生在pagecontent.js(頁面內容的控制器)中。它具有加載各種視圖的功能集。但標題有後退按鈕。我跟蹤歷史記錄,當單擊後退按鈕時,我想調用pagecontent.js上的相應函數來加載特定視圖。下面是我想要做的例子:如何訪問不同控制器的功能? - JavaScript MVC

pagecontent.js

$.Controller('Controller.Pagecontent', { 
    ... 
    ".home click": function(){ 
     this.loadHome(); 
    }, 
    loadHome: function(){ 
     $('#pagecontent').html('//views/home', {}); 
    } 
    ... 
}) 

header.js

$.Controller('Controller.Header', { 
    ... 
    ".back click": function(){ 
     if(HISTORY[0] == 'home') 
      // call loadHome() from pagecontent.js 
    } 
    ... 
}) 


我不想複製所有這些功能到頭。 js,因爲它將是多餘的,一些函數具有複雜的邏輯。

任何想法?

謝謝。

回答

-1

您可以使用原型訪問其他控制器功能/事件。例如。在這種情況下,這將是這樣的:

$.Controller('Controller.Header', { 
    ... 
    ".back click": function(){ 
     if(HISTORY[0] == 'home') 
     Controller.Pagecontent.prototype.loadHome(); 
    } 
    ... 
}) 
-1

如果js代碼每頁都不相同,那麼可以使用內聯js或在單獨的文件中添加這些代碼行並將其包含在佈局中(假設您有不同的佈局以便相同的js文件是沒有到處加載)

0

JavaScript中的任何定義的對象都可以從瀏覽器頁面中的任何javascript代碼訪問。

如果在同一頁面中加載兩個.js文件,儘管在一個對象中的不同部分中的對象可能會在另一箇中訪問,因此可能會在window對象中定義這些對象。如果file2.js被file1.js後加載

file1.js

var a = 13; 
var b = 14; 

file2.js

alert("a="+a); 

function show_b() { 
    alert("b="+b); 
} 

以 '= 13' 的警報將​​被顯示。只要您在加載兩個文件之前調用show_b(),就會顯示'b = 14'。

爲避免干擾,您可以使用windows.awindows.b而不是ab

相同的例子適用於函數定義。

+0

不幸的是,因爲我使用的控制器,這將不起作用:$ .Controller('Controller.Header ', { ... 功能 ... } );我不能通過從另一個控制器調用它來訪問該函數。 – Sherzod 2012-01-30 22:39:04

0

有很多方法來共享代碼,但在JavaScriptMVC慣用的方法是這樣的:

".back click": function(){ 
    if(HISTORY[0] == 'home') 
    $('#pageContent').controller().loadHome(); 
} 

其中#pageContent是選擇你用於首先創建控制器。

更好的是使用自定義事件。你可以使用jQuery。觸發如果pageContent是頭部的父:

// PageContent 

"home.clicked": function() { 
    this.loadHome(); 
} 

// Header 

".back click": function() { 
    this.element.trigger('home.clicked'); 
} 

或者你可以使用一個OpenAjax事件:

// PageContent 

"home.clicked subscribe": function() { 
    this.loadHome(); 
} 

// Header 

".back click": function() { 
    OpenAjax.hub.publish('home.clicked'); 
} 
相關問題