Я новичок в нокауте и пытаюсь создать простое приложение, в котором я могу динамически добавлять строку данных, но я не понимаю, почему data-bind = "click: remove" in remove button не работает, когда я удаляю data-bind = "click: remove" from remove button, мое приложение будет работать нормально,
Как я могу удалить динамический элемент с помощью этой кнопки удаления?
function people(name) {
return {
name: ko.observable(name),
remove: function () {
viewModal.peoples.remove(this);
}
};
}
var viewModal = {
self: this,
firstName: ko.observable(),
peoples: ko.observableArray([
{ name: 'Franklin' },
{ name: 'Mario' },
]),
addMore: function () {
this.peoples.push(new people(this.firstName()));
}
};
ko.applyBindings(viewModal);<script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "row">
<div class = "col-md-12">
<div class = "row">
<div class = "col-md-6">
<input type = "text" data-bind = "value:firstName" />
</div>
<div class = "col-md-2">
</div>
</div>
<input type = "button" value = "Add People" data-bind = "click:addMore" />
</div>
<div class = "col-md-12" data-bind = "foreach: peoples">
<div class = "row">
<div class = "col-md-6 form-group">
<label data-bind = "text:name"></label>
<input class = "form-control" type = "text" />
</div>
<div class = "col-md-6 form-group">
<input type = "button" class = "btn btn-primary" value = "remove" data-bind = "click: remove" />
</div>
</div>
</div>
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Обновлено: как @GKB указал в комментариях, основная ошибка заключалась в том, что исходные объекты людей не имели метода remove, который я, как оказалось, исправил на этом пути, не особо указывая на это в моем ответе ...
Оригинальный ответ:
Вы не можете использовать this так, как пытались.
Работайте либо с простыми объектами, либо с экземплярами класса new:
Рабочий пример:
// Example 1: using plain objects
function Person(name, app) {
const self = {
name: ko.observable(name),
remove: () => app.people.remove(self)
};
return self;
}
// Example 2: using `new`
var App = function() {
const self = this;
this.firstName = ko.observable(),
this.people = ko.observableArray(
[ "Franklin", "Mario" ].map(
name => Person(name, self)
)
);
};
App.prototype.addPerson = function() {
this.people.push(Person(this.firstName(), this));
this.firstName("");
};
ko.applyBindings(new App());<script src = "https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "row">
<div class = "col-md-12">
<div class = "row">
<div class = "col-md-6">
<input type = "text" data-bind = "value: firstName" />
</div>
<div class = "col-md-2">
</div>
</div>
<input type = "button" value = "Add People" data-bind = "click: addPerson" />
</div>
<div class = "col-md-12" data-bind = "foreach: people">
<div class = "row">
<div class = "col-md-6 form-group">
<label data-bind = "text:name"></label>
<input class = "form-control" type = "text" data-bind = "textInput: name" />
</div>
<div class = "col-md-6 form-group">
<input type = "button" class = "btn btn-primary" value = "remove" data-bind = "click: remove" />
</div>
</div>
</div>
</div>Упс ... Я был слишком спровоцирован использованием this, что я только случайно исправил фактическую ошибку ... Вы хотите опубликовать ее в качестве ответа, или я должен отредактировать свою?
о, [ "Franklin", "Mario" ].map(, вот где я ошибаюсь, верно?
Да, как справедливо заметил @gkb, единственная «настоящая» ошибка заключалась в том, что вы забыли привести своих первоначальных людей к объектам Person.
Большое спасибо @gkb
Фактически,
thisработает так же, как и OP. Проблема заключается в том, что наблюдаемый массивpeoplesне содержит экземпляров объектовpeople. Вместо этого у них есть анонимные объекты, для которых не определена функцияremove... поиграйте здесь jsfiddle.net/Lhjytgn8