154

シンプルな To Do リストですが、各項目のリスト ページに削除ボタンがあります。

ここに画像の説明を入力

関連するテンプレート HTML:

<tr ng-repeat="person in persons">
  <td>{{person.name}} - # {{person.id}}</td>
  <td>{{person.description}}</td>
  <td nowrap=nowrap>
    <a href="#!/edit"><i class="icon-edit"></i></a>
    <button ng-click="delete(person)"><i class="icon-minus-sign"></i></button>
  </td>
</tr>

関連するコントローラーの方法:

$scope.delete = function (person) {
  API.DeletePerson({ id: person.id }, function (success) {
    // I need some code here to pull the person from my scope.
  });
};

私は試し$scope.persons.pull(person)てみ$scope.persons.remove(person)ました。

データベースは正常に削除されましたが、このアイテムをスコープからプルすることはできず、クライアントが既に持っているデータに対してサーバーにメソッド呼び出しを行いたくありません。この 1 人をスコープから削除したいだけです。

何か案は?

4

10 に答える 10

311

person配列内のインデックスを見つけてからpersons、配列のspliceメソッドを使用する必要があります。

$scope.persons.splice( $scope.persons.indexOf(person), 1 );
于 2013-01-10T04:08:33.613 に答える
260

あなたの問題はAngularではなく、Arrayメソッドにあります。配列から特定の項目を削除する適切な方法は、 を使用することArray.spliceです。$indexまた、ng-repeat を使用すると、渡した配列の現在のインデックスである特別なプロパティにアクセスできます。

解決策は実際には非常に簡単です。

意見:

<a ng-click="delete($index)">Delete</a>

コントローラ:

$scope.delete = function ( idx ) {
  var person_to_delete = $scope.persons[idx];

  API.DeletePerson({ id: person_to_delete.id }, function (success) {
    $scope.persons.splice(idx, 1);
  });
};
于 2013-01-10T04:11:21.660 に答える
8

便利な関数のリストがあるUnderscore.jsライブラリを使用します。

without

without_.without(array, *values)

値のすべてのインスタンスが削除された配列のコピーを返します。

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
// => [2, 3, 4]

var res = "deleteMe";

$scope.nodes = [
  {
    name: "Node-1-1"
  },
  {
    name: "Node-1-2"
  },
  {
    name: "deleteMe"
  }
];
    
$scope.newNodes = _.without($scope.nodes, _.findWhere($scope.nodes, {
  name: res
}));

JSFiddleのデモを参照してください。


filter

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });

// => [2, 4, 6]

$scope.newNodes = _.filter($scope.nodes, function(node) {
  return !(node.name == res);
});

Fiddleのデモを参照してください。

于 2013-07-02T09:32:00.993 に答える
4

list に関連付けられた関数がある場合、 splice 関数を作成すると、関連付けも削除されます。私の解決策:

$scope.remove = function() {
    var oldList = $scope.items;
    $scope.items = [];

    angular.forEach(oldList, function(x) {
        if (! x.done) $scope.items.push( { [ DATA OF EACH ITEM USING oldList(x) ] });
    });
};

list パラメータの名前はitemsです。パラメータx.doneは、アイテムが削除されるかどうかを示します。

別の参照:別の例

お役に立てれば幸いです。ご挨拶。

于 2014-09-04T12:33:03.477 に答える
2

これも使えます

$scope.persons = $filter('filter')($scope.persons , { id: ('!' + person.id) });
于 2016-01-04T09:05:46.373 に答える
1
array.splice(array.pop(item));
于 2016-05-20T22:44:55.520 に答える
1

Angular には という組み込み関数がarrayRemoveあります。この場合、メソッドは単純に次のようになります。

arrayRemove($scope.persons, person)
于 2013-08-01T05:37:52.157 に答える