1

我慢慢加深瞭解的JavaScript,但我卡在如何最好地解決這個特定組織/執行情況。更好的JavaScript的組織和執行不顯眼的方式 - 自執行的匿名函數功能

我來自一個C#背景,習慣了與命名空間,所以我一直對如何使用JavaScript來實現這個讀了工作。我採取了已經開始變成大型JavaScript文件並將其分解成更多邏輯部分的內容。

我已經決定在每頁一個文件頁面的JavaScript特定的具有共同的任何兩個或兩個以上的頁面,像可重複使用的實用功能,在另一個命名空間和文件。

這對我來說很有意義的時刻,似乎是一個普遍的選擇,在開發過程中至少。我打算使用捆綁工具將這些不同的文件整合到生產環境中,以便使開發更合理,更容易找到更好的代碼。

正如我在處理大量的自定義JavaScript的經驗不足的結果,我曾在常見的JavaScript定義的函數文件是這樣的:

common.js

$(document).ready(function() { 
    var historyUrl = '/history/GetHistory/'; 
    $.getJSON(historyUrl, null, function (data) { 
     $.each(data, function (index, d) { 
      $('#history-list').append('<li>' + d.Text + '</li>'); 
     }); 
    }); 
}); 

這顯然不能從理想,因爲它具體到應用程序中的單個頁面,但是在每個頁面請求上執行都是完全沒有意義的,如果不是徹頭徹尾的愚蠢,它是非常低效的。所以這讓我開始閱讀名字空間。

有點讀我現在已經搬到這一個頁面特定的文件和經過重新編寫這樣的:

從common.js移到historyPage.js

(function(historyPage, $, undefined) { 

    historyPage.GetHistory = function() { 
     var historyUrl = '/history/GetHistory/'; 
     $.getJSON(historyUrl, null, function (data) { 
      $.each(data, function (index, d) { 
       $('#history-list').append('<li>' + d.Text + '</li>'); 
      }); 
     }); 
    }; 
    }(window.historyPage = window.historyPage || {}, jQuery)); 

我在jQuery Enterprise page上發現了這種模式。我不打算完全理解它,但它似乎是一種非常流行和最靈活的組織和執行各種不同範圍的JavaScript的方法,它使事情遠離全球範圍。

但是什麼現在我掙扎是如何正確使用這種模式從一個角度執行點。我也試圖讓我的HTML Razor視圖保留任何JavaScript,並且以不顯眼的方式工作。

那麼現在如何才能在historyPage.GetHistory函數纔會實際執行,即:只有當用戶導航到網站上的歷史頁面並且函數的結果是必需的?

回答

0

使用我在上面的問題,我得到它做的工作有詳細的代碼如下:

在_Layout.cshtml

@if (IsSectionDefined("History")) 
    { 
     <script type="text/javascript"> 
      $(document).ready(function() { 
      @RenderSection("History", required: false) 
     }); 
     </script> 
    } 

在History.cshtml

@section History 
{ 
    historyPage.GetHistory(); 
} 

僅當用戶請求歷史記錄時,代碼才按需執行在網站上的頁面。雖然上面的@Dagg Nabbit發表的評論已經給我一個曲線球,因爲我認爲我是在正確的軌道上......嗯...

0

從查看代碼看來,最簡單的測試就是檢查您所在的頁面是否包含idhistory-list。事情是這樣的:

var $histList = $('#history-list'); 

if($histList.length > 0){ 
    // EXECUTE THE CODE 
} 

但如果它真的永遠只需要一個特定網頁上運行,也許它只是不適合共享的JavaScript文件一個很好的候選人。

+0

它不在共享文件中,它只在historyPage.js文件中包含代碼爲歷史頁面。有沒有更好的方法來封裝特定頁面的代碼? – Jammer 2013-05-07 20:55:19

+0

如果這個腳本只需要在一個頁面上運行,爲什麼你需要首先「命名空間」呢?只需編寫'function getHistory(){...}'一次,並只將其包含在該頁面上。如果你已經有一個全局的「命名空間」對象,那麼使用'myNS.getHistory = function(){...};' - 這裏真的沒有理由讓這個混亂的IIFE,這聽起來像你肯定知道' historyPage'存在,所以應該不需要'window.historyPage = window.historyPage || {}'(並且不需要'undefined',因爲你沒有使用它;並不是因爲'void'而有* *)。 – 2013-05-07 20:59:02

+0

我是新來的,可能會帶來很多JavaScript。我試圖通過看似很渾濁的水域來瀏覽各種不同的意見和方法。老實說,我對你的評論感到困惑。就像我說過的,我並沒有假裝完全理解它。銘記我也試圖做的事情不顯眼我不知道如何或在哪裏我只會寫'函數getHistory()'就我而言,我只寫了函數一次,沒有重複的代碼任何地方。對不起,如果我仍然是愚蠢的。 – Jammer 2013-05-07 21:59:02