Обработчик успеха Knockout X-Editable не вызывается

У меня есть столбец в таблице с нокаутирующими x-редактируемыми значениями привязки. После загрузки страницы и в результате привязки ko для каждой строки вызывается обработчик успеха (и это нормально, я могу этого избежать). Но как только страница настроена, и я продолжаю и изменяю значение (устанавливаю любой из EmployeeId строки на 7-значное число), обработчик успеха больше не вызывается. Посмотрите эту скрипту с открытым журналом консоли:

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 и подписавшись на событие его изменения. Но с подпиской я получаю только новое значение в качестве параметра. Мне понадобится строка данных и идентификатор заявителя из нее. СотрудникId может быть не уникальным, и мне нужно, чтобы вызов API сохраняемости требовал идентификатора заявителя и сотрудника.

Как я могу это решить?


person Csaba Toth    schedule 09.01.2015    source источник


Ответы (1)


Я не мог сделать то, что вы пытались сделать с привязкой success (я не думаю, что вы можете это сделать), но вместо этого я просто использовал Knockout с subscribe.

Объявите Applicant ViewModel, так как нам нужно, чтобы employeeId был наблюдаемым для подписки:

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);
    });
}

Измените заполнение массива кандидатов, чтобы вместо него использовалась Applicant ViewModel:

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

person Wayne Ellery    schedule 10.01.2015
comment
Ох, хорошо. Поэтому я инкапсулирую строки в объект Applicant, а затем могу ссылаться на идентификатор заявителя, используя self. Я это сделаю. Я все еще удивляюсь, почему обработчик успеха перестает работать. - person Csaba Toth; 10.01.2015
comment
Он перестает работать, потому что вы назначаете его неправильно. Вы не можете использовать успех: $root.persistEmployeeId($data), он должен быть успешным: $root.persistEmployeeId. Согласно документации вы можете получить только новое значение и все - person Wayne Ellery; 10.01.2015
comment
Хммм, но если вы посмотрите на журнал консоли, в начале приходят три уведомления, содержащие $data. Так почему же тогда это работает какое-то время? В любом случае... - person Csaba Toth; 10.01.2015