1

我有一個表中的列與敲除x可編輯的綁定值。在頁面加載和ko綁定後,每行都會調用成功處理程序(這很好,我可以避免這種情況)。但是,一旦頁面設置好了,我繼續前進並更改一個值(將行的employeeId中的任何一個設置爲7位數字),則不會再調用成功處理程序。看到這個撥弄打開控制檯日誌:Knockout X可編輯成功處理程序不叫

http://jsfiddle.net/csabatoth/y3rfe6Lw/6/

HTML:

<table style="table table-striped"> 
    <thead> 
     <tr> 
      <td>First Name</td> 
      <td>Last Name</td> 
      <td>Employee ID</td> 
     </tr> 
    </thead> 
    <tbody data-bind="foreach: candidates"> 
     <tr> 
      <td><span data-bind="text: firstName"></span></td> 
      <td><span data-bind="text: lastName"></span></td> 
      <td><span data-bind="editable: employeeId, editableOptions: { validate: $root.validateEmployeeId, success: $root.persistEmployeeId($data) }"></span></td> 
     </tr> 
    </tbody> 
</table> 

JS:

$(document).ready(function() { 
    function AppViewModel() { 
     var self = this; 

     self.validateEmployeeId = function (value) { 
      if (value == null || !value.match(/^\d{7}$/)) 
       return 'Invalid EmployeeID'; 
     } 

     self.persistEmployeeId = function (data) { 
      console.log(data.employeeId); 
     } 

     self.candidates = ko.observableArray([ 
      { firstName: "John", lastName: "Dow", employeeId: 1001, applicantId: 1 }, 
      { firstName: "Jane", lastName: "Doe", employeeId: 1002, applicantId: 2 }, 
      { firstName: "Foo", lastName: "Bar", employeeId: 1003, applicantId: 3 } 
     ]); 
    } 

    // Activates knockout.js 
    ko.applyBindings(new AppViewModel()); 

}); 

我需要堅持,雖然該數據的變化。我嘗試通過使employeeId ko.observable和訂閱它的更改事件來解決此問題。但是,訂閱我只收到newValue作爲參數。我需要數據行和申請人ID。 employeeId可能不是唯一的,我需要持久性API調用需要applicantId和employeeId。

我該如何解決這個問題?

回答

1

我不能做你想用success綁定(我認爲你不能這樣做),但我只是用subscribe使用Knockout。

聲明Applicant視圖模型,因爲我們需要僱員是一個觀察的訂閱:

var Applicant = function (model) { 
    var self = this; 

    self.firstName = model.firstName; 
    self.lastName = model.lastName; 
    self.employeeId = ko.observable(model.employeeId); 
    self.applicantId = model.applicantId; 

    self.employeeId.subscribe(function (newValue) { 
     console.debug('Applicant ' + self.applicantId + ' now has employeeId: ' + newValue); 
    }); 
} 

更改考生arrray人口使用申請人視圖模型來代替:

var candidates = [ 
    new Applicant({ firstName: "John", lastName: "Dow", employeeId: 1001, applicantId: 1 }), 
    new Applicant({ firstName: "Jane", lastName: "Doe", employeeId: 1002, applicantId: 2 }), 
    new Applicant({ firstName: "Foo", lastName: "Bar", employeeId: 1003, applicantId: 3 }) 
]; 

self.candidates = ko.observableArray(candidates); 

JsFiddle

+0

哦, 好。所以我將行封裝到一個申請人「對象」中,然後我可以使用self來引用申請人。我會去做。我仍然想知道爲什麼成功處理程序停止工作。 – 2015-01-10 02:31:30

+0

因爲您錯誤地分配它而停止工作。您不能使用成功:$ root.persistEmployeeId($ data)它需要成功:$ root.persistEmployeeId。根據文檔,你只能得到新的值,這全是 – 2015-01-10 02:34:10

+0

嗯,但是如果你看看控制檯日誌,三個通知在開始時到達,攜帶$數據。那麼爲什麼它的工作一段時間呢?無論如何... – 2015-01-10 07:01:19