2017-11-06 7 views
1

http://www.dotnetcurry.com/aspnet-mvc/933/knockoutjs-aspnet-mvc-tutorial-beginner에있는 자습서를 따라했습니다. 자습서는 훌륭하고 추가 및 업데이트를 다루지 만 업데이트 삭제 또는 취소에 포함 된 클릭 핸들러는 없습니다.MVC DataTable의 KnockoutJS 삭제 함수

작성자가 데이터 저장을 위해 제공 한 패턴과 동일한 패턴을 따르려고했지만 삭제할 함수를 만들었지 만 작동하지 않습니다.

<table class="table"> 
    <tr> 
     <th>concerns_id</th> 
     <th>concerns_description</th> 
     <th></th> 
    </tr> 
    <tbody data-bind="foreach: ConcernCollection"> 
    <tr data-bind="template: { name: Mode, data: $data }"></tr> 
    </tbody> 
</table> 

템플릿 :

<script type="text/html" id="display"> 
    <td data-bind="text: concerns_id"></td> 
    <td data-bind="text: concerns_description"></td> 
    <td> 
    <button class="btn btn-success kout-edit">Edit</button> 
    <button class="btn btn-danger kout-delete">Delete</button> 
    </td> 
</script> 

<script type="text/html" id="edit"> 
    <td><input type="text" data-bind="value: concerns_id " /></td> 
    <td><input type="text" data-bind="value: concerns_description" /></td> 
    <td> 
    <button class="btn btn-success kout-update">Update</button> 
    <button class="btn btn-danger kout-cancel">Cancel</button> 
    </td> 
</script> 

전체 JS 삭제 기능이없는 내가 추가 연결 :

$(document).ready(function() { 
$.ajax({ 
    type: "GET", 
    url: "/concerns/GetConcerns", 
}).done(function (data) { 
    $(data).each(function (index, element) { 
     var mappedItem = 
      { 
       concerns_id: ko.observable(element.concerns_id), 
       concerns_description: ko.observable(element.concerns_description), 
       Mode: ko.observable("display") 
      }; 
     viewModel.ConcernCollection.push(mappedItem); 
    }); 
    ko.applyBindings(viewModel); 
}).error(function (ex) { 
    alert("Error"); 
}); 

$(document).on("click", ".kout-edit", null, function (ev) { 
    var current = ko.dataFor(this); 
    current.Mode("edit"); 
}); 

$(document).on("click", ".kout-update", null, function (ev) { 
    var current = ko.dataFor(this); 
    saveData(current); 
    current.Mode("display"); 
}); 



$(document).on("click", "#create", null, function (ev) { 
    var current = { 
     concerns_id: ko.observable(0), 
     concerns_description: ko.observable(), 
     Mode: ko.observable("edit") 
    } 
    viewModel.ConcernCollection.push(current); 
}); 

function saveData(currentData) { 
     var postUrl = ""; 
     var submitData = { 
      concerns_id: currentData.concerns_id(), 
      concerns_description: currentData.concerns_description(), 
     }; 
     if (currentData.concerns_id && currentData.concerns_id() > 0) { 
      postUrl = "/concerns/Edit" 
     } 
     else { 
      postUrl = "/concerns/Create" 
     } 
     $.ajax({ 
      type: "POST", 
      contentType: "application/json", 
      url: postUrl, 
      data: JSON.stringify(submitData) 
     }).done(function (id) { 
      currentData.concerns_id(id); 
     }).error(function (ex) { 
      alert("ERROR Saving"); 
     }) 
    } 
}); 

어떤 도움

function deleteData(currentData) { 
    var postUrl = ""; 
    var submitData = { 
     concerns_id: currentData.concerns_id(), 
     concerns_description: currentData.concerns_description(), 
    }; 
    if (currentData.concerns_id > 0) { 
     postUrl = "/concerns/delete" 
    } 
    $.ajax({ 
     type: "POST", 
     contentType: "application/json", 
     url: postUrl, 
     data: JSON.stringify(submitData) 
    }).done(function (id) { 
     currentData.concerns_id(id); 
    }).error(function (ex) { 
     alert("ERROR Deleting"); 
    }) 
}; 

테이블입니다 또는지도는 이것이 내 전나무 다. ST는 시간 코드를 따라하기 조금 어렵다, 나는 거 거짓말 아니에요

감사합니다,

답변

1

Knockout.js 작업. 나는 정말로 당신이 완전히 녹아웃 경험을하고 있다고 생각하지 않습니다. 작은 녹아웃을 조합하여 녹아웃을 사용하여 목록에서 항목을 추가/제거하고 표시하는 방법을 보여줍니다.

data-bind에 녹아웃을 사용해야합니다. 솔직히 클래스별로 청취자를 연결하기 위해 jQuery를 사용할 필요가 없습니다. 이것이 코드가 스파게티가되는 방식입니다.

질문하는 동안 묻지 않지만 자습서를 계속 진행하기 전에 http://learn.knockoutjs.com/을 방문하는 것이 좋습니다.

도움이 되었기를 바랍니다.

function ViewModel() { 
 
    var self = this; 
 

 
    self.Items = ko.observableArray(); 
 

 

 
    self.DeleteRow = function(row) { 
 
    // Your ajax call here 
 
    self.Items.remove(row); 
 
    } 
 

 
    self.AddRow = function() { 
 
    self.Items.push("Added Item at " + new Date()); 
 
    } 
 

 
    self.LoadFakeData = function() { 
 
    // Put ajax calls here 
 
    for (i = 0; i < 10; i++) { 
 
     self.Items.push("Item " + i); 
 
    } 
 
    } 
 

 
    self.Load = function() { 
 
    self.LoadFakeData(); 
 
    } 
 

 
    self.Load(); 
 
} 
 

 
ko.applyBindings(new ViewModel())
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> 
 
<div data-bind="foreach: Items"> 
 
    <span data-bind="text: $data"></span> 
 
    <span data-bind="click: $parent.DeleteRow">X</span> 
 
    <br> 
 
</div> 
 
<hr> 
 
<span data-bind="click: AddRow">Add Row</span>