Удалить определенный элемент из массива в Knockout.JS
Я создаю многопользовательскую игру по сети, поэтому мне приходится реагировать на сетевые события.
У меня есть этот простой код, но метод removePlayer не работает. Функция addPlayer() отлично работает.
<table id="userlist2" class="tablesorter" cellspacing="0">
<thead>
<tr>
<th>Name</th>
<th>Queue</th>
<th>Points</th>
</tr>
</thead>
<tbody data-bind="foreach: players">
<tr>
<td data-bind="text: name"></td>
<td data-bind="text: queue"></td>
<td data-bind="text: score"></td>
</tr>
</tbody>
</table>
function PlayerViewModel() {
var self = this;
self.players = ko.observableArray();
self.addPlayer = function (Name, QueuePos, Score) {
self.players.push({
name: Name,
queue: QueuePos,
score: Score
});
}
self.removePlayer = function (Name) {
for (var i = 0; i < self.players().length; i++) {
if (self.players()[i].name == Name) console.log(i);
self.players().splice(i, 1);
}
}
}
players = new PlayerViewModel();
ko.applyBindings(players);
players.addPlayer('Player1', '0', '0');
players.addPlayer('Player2', '0', '0');
players.removePlayer('Player2');
Здесь http://jsfiddle.net/xseTc/
Ответы
Ответ 1
Вы должны использовать удалить функцию:
self.removePlayer = function (Name) {
self.players.remove(function(player) {
return player.name == Name;
});
}
См. скрипку
HTML
<table id="userlist2" class="tablesorter" cellspacing="0">
<thead>
<tr>
<th>Name</th>
<th>Queue</th>
<th>Points</th>
</tr>
</thead>
<tbody data-bind="foreach: players">
<tr>
<td data-bind="text: name"></td>
<td data-bind="text: queue"></td>
<td data-bind="text: score"></td>
</tr>
</tbody>
</table>
Javascript
function PlayerViewModel() {
var self = this;
self.players = ko.observableArray();
self.addPlayer = function (Name, QueuePos, Score) {
self.players.push({
name: Name,
queue: QueuePos,
score: Score
});
}
self.removePlayer = function (Name) {
self.players.remove(function(player) {
return player.name == Name;
});
}
}
players = new PlayerViewModel();
ko.applyBindings(players);
players.addPlayer('Player1', '0', '0');
players.addPlayer('Player2', '0', '0');
players.removePlayer('Player2', '0', '0');
Ответ 2
Рабочая функция удаления:
self.removePlayer = function (Name) {
self.players.remove(function(player) { return player.name == Name });
}
Ответ 3
ваш код прекрасен, кроме 2 ошибок:
if (self.players()[i].name == Name) console.log(i);
self.players().splice(i, 1);
сначала вы выполняете 2 строки, поэтому для их выполнения вы должны использовать {}
, поэтому замените его на:
if (self.players()[i].name == Name) {
console.log(i);
self.players.splice(i, 1);
}
секунд для использования splice
вам нужно вызвать ваш наблюдаемый массив с помощью ()
, чтобы вы могли использовать его как:
self.players.splice(i, 1);
Рабочий демонстрационный пример