2014-11-19 5 views
0

녹아웃을 사용하여 가변 길이 목록을 편집하고 있습니다. Add Button을 클릭하면 DropDownList 및 TextBox가 화면에 추가됩니다. 성공적으로 데이터베이스에서 DropDownList 데이터를로드했지만 추가 단추를 클릭 할 때마다 항상 데이터를 채 웁니다.녹아웃을 사용하여 데이터베이스에서 DropDownList로 데이터로드

코드 :

<div class="form-horizontal" data-bind="with: purchaseOrder"> 
    <h4>Purchase Order</h4> 
    <hr /> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="PurchaseOrderDate">PO Date</label> 
     <div class="col-md-10"> 
      <input class="form-control" data-bind="value: PurchaseOrderDate" placeholder="Purchase Order Date" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="InvoiceNo">Invoice No</label> 
     <div class="col-md-10"> 
      <input class="form-control" data-bind="value: InvoiceNo" placeholder="Invoice No" /> 
     </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-md-2" for="Memo">Memo</label> 
     <div class="col-md-10"> 
      <input class="form-control" data-bind="value: Memo" placeholder="Enter Memo" /> 
     </div> 
    </div> 
</div> 

<h4>Details</h4> 
<hr /> 

<table class="table"> 
    <thead> 
     <tr> 
      <th>Item Name</th> 
      <th>Qty Order</th> 
      <th></th> 
     </tr> 
    </thead> 
    <tbody data-bind="foreach: purchaseOrderDetails"> 
     <tr> 
      <td> 
       <select class="form-control" data-bind="options: AX_INVENTSUMs, optionsText: 'ITEMNAME', optionValue: 'ITEMID'"></select> 
      </td> 
      <td> 
       <input class="form-control" data-bind="value: QuantityOrder" placeholder="Enter Quantity Order"> 
      </td> 
      <td> 
       <a class="btn btn-sm btn-danger" href='#' data-bind=' click: $parent.removeItem'>X</a> 
      </td> 
     </tr> 
    </tbody> 
</table> 

<p> 
    <button class="btn btn-sm btn-primary" data-bind='click: addItem'>Add Item</button> 
</p> 

@section Scripts { 
    @Scripts.Render("~/bundles/knockout") 
    <script> 
     $(function() { 
      var PurchaseOrder = function (purchaseOrder) { 
       var self = this; 

       self.PurchaseOrderID = ko.observable(purchaseOrder ? purchaseOrder.PurchaseOrderID : 0); 
       self.PurchaseOrderDate = ko.observable(purchaseOrder ? purchaseOrder.PurchaseOrderDate : ''); 
       self.InvoiceNo = ko.observable(purchaseOrder ? purchaseOrder.InvoiceNo : ''); 
       self.Memo = ko.observable(purchaseOrder ? purchaseOrder.Memo : ''); 
      }; 

      var PurchaseOrderDetail = function (purchaseOrderDetail, items) { 
       var self = this; 

       self.PurchaseOrderDetailID = ko.observable(purchaseOrderDetail ? purchaseOrderDetail.PurchaseOrderDetailID : 0); 
       self.PurchaseOrderID = ko.observable(purchaseOrderDetail ? purchaseOrderDetail.PurchaseOrderDetailID : 0); 
       self.ItemID = ko.observable(purchaseOrderDetail ? purchaseOrderDetail.ItemID : 0); 
       self.QuantityOrder = ko.observable(purchaseOrderDetail ? purchaseOrderDetail.QuantityOrder : 0); 
       self.QuantityBonus = ko.observable(purchaseOrderDetail ? purchaseOrderDetail.QuantityBonus : 0); 

       self.AX_INVENTSUMs = ko.observableArray(items); 
      }; 

      var PurchaseOrderCollection = function() { 
       var self = this; 

       self.purchaseOrder = ko.observable(new PurchaseOrder()); 
       self.purchaseOrderDetails = ko.observableArray([new PurchaseOrderDetail()]); 

       self.CashedArray = ko.observableArray([]); 
       $.getJSON("/AX_INVENTSUM/GetAX_INVENTSUMs", null, function (data) { 
        var array = []; 
        $.each(data, function (index, value) { 
         array.push(value); 
        }); 
        self.CashedArray(array); 
       }); 

       self.addItem = function() { 
        self.purchaseOrderDetails.push(new PurchaseOrderDetail(null, self.CashedArray)); 
       }; 

       self.removeItem = function (purchaseOrderDetail) { 
        self.purchaseOrderDetails.remove(purchaseOrderDetail); 
       }; 
      }; 

      ko.applyBindings(new PurchaseOrderCollection()); 
     }); 
    </script> 
} 

위의 코드에서 볼 수 있듯이, 어떻게 한 번만 시간을 발생하게?

+0

'버튼 추가'의 기능은 무엇입니까? 매번 새로운 PurchaseOrderDetail을 생성한다고 가정합니다. – Ivan

+0

두 번째 @Ivan. 좀 더 일반적인 참고로, 문제의 코드를 사용하여 문제를 재현 할 수는 없기 때문에 (추측에 의지하지 않고) 귀하를 실제로 도울 수는 없습니다. 답변을 편집하고 세부 정보를 추가 할 수 있습니까? 문제를 재현하기 위해 스택 스 니펫으로 완성 하시겠습니까? – Jeroen

+0

@Ivan 그렇습니다. 원하는 것은 데이터베이스에서 데이터를 유지할 변수가있을 수 있습니다. 추가 버튼을 클릭하면 해당 변수를 사용하여 드롭 다운 목록에 바인딩 할 수 있습니다. – Willy

답변

1

어딘가에 목록을 캐시해야합니다. 부모보기 모델과 같은 것으로 선호합니다. 벨로우즈보기.

var OrderList = function(){ 
    var self = this; 
    ... 
    self.CashedArray = ko.observableArray(new Array()); 
    $.getJSON("/AX_INVENTSUM/GetAX_INVENTSUMs", null, function (data) { 
     var array = []; 
     $.each(data, function (index, value) { 
      array.push(value); 
     }); 
     self.CashedArray(array); 
    }); 
    self.AddButtonClick = function(){ 
     var orderDetails = new PurchaseOrderDetail(self.CashedArray()); 
    }; 
}; 

var PurchaseOrderDetail = function (items) { 
    var self = this; 
    ... 
    self.AX_INVENTSUMs = ko.observableArray(items); 
}; 
+0

나는 그것을 시도해 주겠다. – Willy

+0

데이터가 페이지로드시로드되지 않고 추가 버튼을 클릭했을 때 오류가 발생했습니다. '0x800a139e - Microsoft JScript 런타임 오류 : 관찰 가능 어레이를 초기화 할 때 전달되는 인수는 배열이어야합니다 , 또는 null 또는 undefined.' 코드를 업데이트했습니다. – Willy

+0

@Willy, self.purchaseOrderDetails.push (새 PurchaseOrderDetail (null, self.CashedArray)); - 작동 안 할 것이다. use를 다음과 같이 변경해야합니다. self.purchaseOrderDetails.push (새 PurchaseOrderDetail (null, self.CashedArray())); self.CashedArray - 관찰 할 수있는 배열입니다. 따라서 'observableArray'가 아닌 'array'가 자식 뷰 모델에 전달되어야합니다. – Ivan

관련 문제