JQuery Ajax 與 Knockout.js的結合


  項目中遇到太多JQuery Ajax 與 Knockout.js的結合來處理數據的情況,今天將這部分內容梳理一下。一來弄清楚二者結合處理數據的流程,二來是感覺二者結合在一起用的時候有點將二者搞混了,弄不清楚誰是誰,將他們理清,划分他們的職責范圍。

  項目中有這樣一個頁面,需要在關聯訂單處輸入要關聯的訂單號,然后將訂單的信息賦值到對應的地方。

    

  首先我們將需要用到的js文件添加到模板頁上。一個knockout.js文件和一個Jquery文件就OK了,knockout可以到http://knockoutjs.com/去下載。

    

  <script src="@Url.Content("~/Js/knockout-2.1.0.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Js/jquery-1.7.2.js")" type="text/javascript"></script>

  然后就是Konckout的使用了,這里我們先不考慮“關聯訂單”的訂單編號的獲取問題,這個並不難。我們先通過Konckout給該文本框一個事件。怎么添加這個事件呢?相關的文檔在http://knockoutjs.com/頂部導航欄的Documentation里都可以找到。這里要說的就是,為Html標簽添加Konckout的時候,記住data-bind=" "就行了,這是為Html標簽添加Konckout的固定標簽。下面我們就先為“關聯訂單”文本框添加一個blur事件來獲取訂單的信息。

   

<input name="RelationOrderID" type="text"  data-bind="event:{blur:OrderDetailGet}" id="RelationOrderID" class="input_02"/>

 

  看到上面代碼中的data-bind="event:{blur:OrderDetailGet}"了嗎?這句話的意思就是:給該標簽添加一個名為OrderDetailGet的blur事件。這里要注意的是:標簽原來的事件名稱叫做onblur,這里叫blur。現在事件已經添加好了,我們就要去實現這個事件。(注意:需要時在html中添加 onkeypress=“return false”,因為這個文本框在form表單內,避免用戶點擊回傳后調用了form表單的提交.....)

  那么怎么完成konckout事件在html中的實現呢,先來看一下konckout和html的一個關系圖。在konckout中有一個名叫“綁定”的東東,只有完成了總的綁定,才能真正使用強度的konckout。如下圖:左邊我們看做是一個konckout對象,假設我們是將相應的屬性綁定到相應的標簽上,如A屬性綁定到<A></A>標簽。這里就看我們選定怎樣的綁定范圍了,如果我們將knockout綁定到div(big),那么我們就能實現將A屬性綁定到A標簽,B屬性綁定到B標簽等等。但是如果我們選定div(small)為綁定范圍,那就不能將值綁定到A標簽了。說了這么多,其實就是講一個konckout綁定范圍的問題。

    

  下面是兩種綁定的代碼,這里用到的$.ajax就是ajax的技術范疇了,其他的都是knockout的范疇。對於這兩種綁定的區別,我並不是很清楚,希望可以有高人指點一下。

  第一種:

  

//第一種
    workOrderModel = function () {
        var self = this;
        self.Details = ko.observableArray();
        self.OrderDetailGet = function () {
            $.ajax({
                type: "POST",                                                           //post 或 get              
                url: requestUrl.getOrderById,                                           //action地址 下面會說到
                dataType: "json",                                                       //數據類型 json
                data: { orderId: $("#RelationOrderID").val() },                         //要傳到的參數  擴展:$("form").serialize() 將form表單的值都傳遞
                success: function (data) {                                              //data 回傳的數據
                    $("#PayStatus").text(data.PaymentStatus);                           //賦值span
                    $("#CountryCode").val(data.CountryCode);                            //賦值input(可用於select賦值)
                    //遍歷 訂單詳情
                    var details = [];
                    $.each(data.Detail, function (idx, product) {
                        details.push({
                            detailId: product.DetailId,
                            sku: product.SKU,
                            img: product.Img,
                            productName: product.ProductName,
                            quantity: product.Quantity,
                            unitPrice: product.UnitPrice,
                            totalPrice: product.TotalPrice
                        });
                    });
                    // 綁定 訂單詳情 這里與第二種不同
                    self.Details(details);
                }
            });
        };
    }
    //這里綁定需要 new對象  與第二種不同 
    //$("#content")[0] 這個參數限定了要綁定的html標簽的范圍,不添加此參數則綁定到最大范圍
    ko.applyBindings(new workOrderModel(), $("#content")[0]);

  第二種:

  

//第二種
    var workOrderModel = {
        Details: ko.observableArray(),
        OrderDetailGet: function () {
            $.ajax({
                type: "POST",
                url: requestUrl.getOrderById,
                dataType: "json",
                data: { orderId: $("#RelationOrderID").val() },
                success: function (data) {
                    //綁定 訂單詳情 這里與第一種不同(省去了循環代碼)
                    var details = [];
                    workOrderModel.Details(details);
                }
            });
        }
    }
    ko.applyBindings(workOrderModel, $("#content")[0]);

  現在說一下上邊講的ajax的url地址為什么要用request.getOrderById。這里原來的地址用的就是“/Controller/Action”,但是在項目部署后因為地址有些不同,就出現了找不到action的情況。那怎么辦,添加@Url.Action("Action","Controller")吧。但是發現這里沒法添加,所以將地址都移到了模板頁頂部去,然后在這里調用就OK了。看代碼:

  

<script type="text/javascript">
    var requestUrl = {
        getOrderById: '@Url.Action("GetOrderById", "Orders")',
        hangOrder: '@Url.Action("HangOrder", "Orders")',
        orderList: '@Url.Action("List", "Orders")'
    };
    </script>

  這里還是添加了一個javascript,將這個js添加到模板頁,那么所有繼承模板頁的頁面要用到的地址都可以寫在這里,然后在自己的頁面調用地址就好了。我們的例子中調用的就是這個js中的requestUrl內的getOrderById。這下看清楚了吧!

  這樣,將JQuery Ajax 與 Knockout.js的結合應用到項目中,就OK了。然后在success中將返回的數據進行一下處理就好了。

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM