Щелкните не работает для наблюдаемого элемента массива

Я новичок в нокауте и пытаюсь создать простое приложение, в котором я могу динамически добавлять строку данных, но я не понимаю, почему 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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: как @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 работает так же, как и OP. Проблема заключается в том, что наблюдаемый массив peoples не содержит экземпляров объектов people. Вместо этого у них есть анонимные объекты, для которых не определена функция remove ... поиграйте здесь jsfiddle.net/Lhjytgn8

gkb 23.11.2018 13:11

Упс ... Я был слишком спровоцирован использованием this, что я только случайно исправил фактическую ошибку ... Вы хотите опубликовать ее в качестве ответа, или я должен отредактировать свою?

user3297291 23.11.2018 13:16

о, [ "Franklin", "Mario" ].map(, вот где я ошибаюсь, верно?

Dhaval Pankhaniya 23.11.2018 13:20

Да, как справедливо заметил @gkb, единственная «настоящая» ошибка заключалась в том, что вы забыли привести своих первоначальных людей к объектам Person.

user3297291 23.11.2018 13:21

Большое спасибо @gkb

Dhaval Pankhaniya 23.11.2018 13:23

Другие вопросы по теме