Есть несколько проблем с вашим кодом:
Основная проблема заключается в том, что вы инициализируете input
непосредственно с jquery, в то время как вы должны делегировать эту ответственность пользовательской привязке , К счастью, другие люди уже сделали эту работу за вас (см. здесь и здесь . В приведенном ниже коде я использую приведенный там код).
Кроме того, у каждого вновь добавленного сотрудника есть одно и то же значение id
, поэтому вы должны присвоить каждому уникальный идентификатор или просто избавиться от него - что я и сделал ниже.
removeFriend
должен быть определен в родительском объекте.
Также обратите внимание, что средство выбора даты, используемое на веб-сайте , на который вы ссылаетесь, не является библиотекой с именем jquery-datetimepicker
, на который вы ссылаетесь в своем вопросе, и, таким образом, я имею в виду.
Вот рабочий (переформатированный) код:
$(document).ready(function() {
initCustomBinding();
initFriends();
});
function initFriends() {
var obj = {
friends: ko.observableArray([new Friend()]),
addFriend: function() {
obj.friends.push(new Friend());
},
removeFriend: function($data) {
obj.friends.remove($data);
}
};
ko.applyBindings(obj);
}
function Friend() {
var self = this;
self.dates = ko.observable();
}
function initCustomBinding() {
ko.bindingHandlers.datetimepicker = {
init: function (element, valueAccessor, allBindingsAccessor) {
var $el = $(element);
//initialize datepicker with some optional options
var options = allBindingsAccessor().datepickerOptions || {};
$el.datetimepicker(options);
//handle the field changing
ko.utils.registerEventHandler(element, "change", function () {
var observable = valueAccessor();
var $el = $(element);
observable($el.datetimepicker("getDate").Value);
});
//handle disposal (if KO removes by the template binding)
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$el.datetimepicker("destroy");
});
},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
$el = $(element),
current = new Date($el.val());
if (value - current !== 0) {
$el.datetimepicker("setDate", value);
}
}
};
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="
https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css">
<h1>Hello JS</h1>
<ul data-bind="foreach:friends">
<li>
<input readonly type="text" data-bind="datetimepicker:dates" />
<button data-bind="click: $root.removeFriend">Remove Employee</button>
</li>
</ul>
<button data-bind="click: addFriend">Add Employee</button>