共用方式為


建立 JavaScript 用戶端

下載已完成的專案

在本節中,您將使用 HTML、JavaScript 和 Knockout.js 程式庫來建立應用程式的用戶端。 我們將分階段組建用戶端應用程式:

  • 顯示書籍清單。
  • 顯示書籍詳細資料。
  • 新增新書籍。

Knockout 程式庫使用 Model-View-ViewModel (MVVM) 模式:

  • 模型是商務領域中資料的伺服器端表示法 (在我們的案例中為書籍和作者)。
  • 檢視是呈現層 (HTML)。
  • 檢視模型是保存模型資料的 JavaScript 物件。 檢視模型是 UI 的程式碼抽象概念。 它不知道 HTML 表示法。 相反地,它代表檢視的抽象特徵,例如「書籍清單」。

檢視是繫結至檢視模型的資料。 檢視模型的更新會自動反映在檢視中。 檢視模型也會從檢視取得事件,例如按鈕點按。

此圖顯示伺服器 Web A P I 和用戶端模型 J S O N 連結的 J A X 和檢視模型,以及資料繫結連結的檢視 H T M L。

這種方法可讓您輕鬆地變更應用程式的版面配置和 UI,因為您可以變更繫結,而不需要重寫任何程式碼。 例如,您可能會將項目清單顯示為 <ul>,然後稍後將它變更為資料表。

新增 Knockout 程式庫

在 Visual Studio 中,從 [工具] 功能表中選取 [NuGet 套件管理員]。 然後選取 [套件管理員主控台]。 在「套件管理員控制台」視窗中,輸入以下命令:

Install-Package knockoutjs

此命令會將 Knockout 檔案新增至 Scripts (指令碼) 資料夾。

建立檢視模型

將名為 app.js 的 JavaScript 檔案新增到 Scripts 資料夾中。 (在方案總管中,以滑鼠右鍵按一下 [指令碼] 資料夾,選取 [新增],然後選取 [JavaScript 檔案]。) 貼上下列程式碼:

var ViewModel = function () {
    var self = this;
    self.books = ko.observableArray();
    self.error = ko.observable();

    var booksUri = '/api/books/';

    function ajaxHelper(uri, method, data) {
        self.error(''); // Clear error message
        return $.ajax({
            type: method,
            url: uri,
            dataType: 'json',
            contentType: 'application/json',
            data: data ? JSON.stringify(data) : null
        }).fail(function (jqXHR, textStatus, errorThrown) {
            self.error(errorThrown);
        });
    }

    function getAllBooks() {
        ajaxHelper(booksUri, 'GET').done(function (data) {
            self.books(data);
        });
    }

    // Fetch the initial data.
    getAllBooks();
};

ko.applyBindings(new ViewModel());

在 Knockout 中,observable 類別會啟用資料繫結。 當可觀察物件的內容發生變更時,可觀察物件會通知所有資料繫結控制項,以便它們可以自行更新。 (observableArray 類別是可觀察的陣列版本。) 首先,我們的檢視模型有兩個可觀察的物件:

  • books 會保存書籍清單。
  • 如果 AJAX 呼叫失敗,則 error 包含錯誤訊息。

getAllBooks 方法會呼叫 AJAX 以取得書籍清單。 然後將結果推送至 books 陣列。

ko.applyBindings 方法是 Knockout 程式庫的一部分。 它會採用檢視模型作為參數,並設定資料繫結。

新增指令碼套件

統合是 ASP.NET 4.5 中的一項功能,可讓您輕鬆地將多個檔案合併或組合成單一檔案。 統合可減少伺服器的要求數目,進而改善頁面載入時間。

開啟檔案 App_Start/BundleConfig.cs。 將下列程式碼新增至 RegisterBundles 方法。

public static void RegisterBundles(BundleCollection bundles)
{
    // ...

    // New code:
    bundles.Add(new ScriptBundle("~/bundles/app").Include(
              "~/Scripts/knockout-{version}.js",
              "~/Scripts/app.js"));
}