NgRepeatディレクティブ内でアイテムの削除を実装する方法についてはかなりの質問があり、私が理解したように、ngClickを使用し、アイテムの$ index。
ただし、複数のngRepeatがある例はどこにも見つかりませんでした。
<div ng-controller="MyController">
<div ng-repeat="email in user.emails">
{{ email }} <a href>Remove</a>
</div>
<div ng-repeat="phone in user.phones">
{{ phone }} <a href>Remove</a>
</div>
</div>
このために、$ scope.removePhoneと$ scope.removeEmailを作成して、ngClickonRemove anchorしかし、私はより一般的なソリューションを探しています。特に、many ngRepeatsのページがたくさんあるので。
私はRemove anchorに配置され、次のようなことをするディレクティブを書くことを考えていました:
したがって、マークアップは次のようになります。
<div ng-controller="MyController">
<div ng-repeat="email in user.emails">
{{ email }} <a href remove-directive="$index">Remove</a>
</div>
<div ng-repeat="phone in user.phones">
{{ phone }} <a href remove-directive="$index">Remove</a>
</div>
</div>
私が達成しようとしているものは可能ですか、これを行うための好ましい方法は何ですか?
現在、私はそれをどのように行っていますか。それはハックでandいですが、きれいな方法を見つけるまで仕事をやり遂げます。
myAppModule.controller('MyController', function ($scope, $parse, $routeParams, User) {
$scope.user = User.get({id: $routeParams.id});
$scope.remove = function ($index, $event) {
// TODO: Find a way to make a directive that does this. This is ugly. And probably very wrong.
var repeatExpr = $($event.currentTarget).closest('[ng-repeat]').attr('ng-repeat');
var modelPath = $parse(repeatExpr.split('in')[1].replace(/^\s+|\s+$/g, ''));
$scope.$eval(modelPath).splice($index, 1);
};
});
そしてDOMで:
<div ng-repeat="email in user.email" class="control-group">
<label class="control-label">
{{ "Email Address"|_trans }}
</label>
<div class="controls">
<input type="text" ng-model="email.address">
<span class="help-inline"><a href ng-click="remove($index, $event)">{{ "Delete"|_trans }}</a></span>
</div>
</div>
削除する配列とアイテムを受け取る汎用のremoveメソッドを作成できます。
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails">{{ email }} <a ng-click="remove(emails, $index)">Remove</a>
</div>
<div ng-repeat="phone in phones">{{ phone }} <a ng-click="remove(phones, $index)">Remove</a>
</div>
</div>
$scope.remove = function(array, index){
array.splice(index, 1);
}
<div ng-repeat="option in options" ng-init=options=[1,2,3,4,5]>
<button ng-click="options.splice($index,1)">Remove me</button>
</div>
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails as datasource">{{ email }}
<a ng-click="datasource.splice($index,1)">Remove</a>
</div>
<div ng-repeat="phone in phones as datasource">{{ phone }}
<a ng-click="datasource.splice($index,1)">Remove</a>
</div>
</div>
クロスブラウザで機能する非常にシンプルで便利な方法は、ライブラリlodashから「remove」ユーティリティメソッドを使用することです。
<div ng-repeat="phone in phones">{{ phone }}
<a ng-click="removeItem(phones, phone)">Remove</a>
</div>
コントローラーで宣言します
//inject lodash dependency
//declare method in scope
$scope.removeItem = function(list, item){
lodash.remove(list,function(someItem) { return item === someItem});
}
もちろん、必要に応じてインデックスを使用できます。 https://lodash.com/docs#remove を参照してください
配列ではなくオブジェクトでng-repeatを使用した場合は、次の手順を実行します。
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails">{{ email }}
<a ng-click="remove(emails, email)">Remove</a>
</div>
<div ng-repeat="phone in phones">{{ phone }}
<a ng-click="remove(phones, phone)">Remove</a>
</div>
</div>
$scope.remove = function(objects, o){
delete object[o.id];
}
またはもっと簡潔
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails">{{ email }}
<a ng-click="delete emails[email.id]">Remove</a>
</div>
<div ng-repeat="phone in phones">{{ phone }}
<a ng-click="delete phones[phone.id]">Remove</a>
</div>
</div>
オブジェクトはこのように見えると仮定します
var emails = { '123' : { id : '123', .... } };
var phones = { '123' : { id : '123', .... } };