92

私は Angular.js を初めて使用し、配列の並べ替えとその並べ替えられたデータの処理に問題があります。

アイテムのリストがあり、「Store.storeName」でソートしたいので、これまでのところ機能しています。しかし、データを並べ替えた後、削除機能が機能しなくなりました。ソート後に $index が間違っているため、間違ったデータが削除されているためだと思います。

どうすれば解決できますか?ビューではなくスコープでデータを並べ替えますか? どうやってするか?

関連するコードを次に示します。

ビューで:

<tr ng-repeat="item in items | orderBy:'Store.storeName'">
                <td><input class="toggle" type="checkbox" ng-model="item.Completed"></td>
                <td>{{item.Name}}</td>
                <td>{{item.Quantity}} Stk.</td>
                <td>{{item.Price || 0 | number:2}} €&lt;/td>                
                <td>{{item.Quantity*item.Price|| 0 | number:2}} €&lt;/td>
                <td>{{item.Store.storeName}}</td> 
                <td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td>
            </tr>

そして、私のコントローラーには、特定のデータを削除する必要があるこの削除機能があります。

$scope.removeItem = function(index){
        $scope.items.splice(index,1);
    }

これは、ビューで注文する前にうまく機能します。何か重要なものが欠けている場合は、今すぐお任せください。

ありがとう!

4

6 に答える 6

140

$indexお気づきのように、並べ替え/フィルター処理された配列のインデックスを指す代わりに、アイテム自体をremoveItem関数に渡すことができます。

<a><img src="img/delete.png" ng-click="removeItem(item)">{{$index}}</a>

次のように、配列removeItemのメソッドを使用してインデックスを見つけるように関数を変更します。indexOf

$scope.removeItem = function(item){
   $scope.items.splice($scope.items.indexOf(item),1);
}
于 2013-04-20T09:49:15.137 に答える
4

これを試して:

$scope.remove = function(subtask) {

    var idx = $scope.subtasks.indexOf(subtask),
        st = $scope.currentTask.subtasks[idx];

    // remove from DB
    SubTask.remove({'subtaskId': subtask.id});

    // remove from local array
    $scope.subtasks.splice(idx,1);

}

詳細な説明は、私のブログのこのエントリにあります。

于 2013-07-25T12:49:39.993 に答える
1

コメントを残したはずですが、「評判」はありません。

マイルのソリューションは、まさに私が必要としていたものでもあります。pkozlowski.opensource の質問に答えるには: ネストされたngRepeats、動的リスト (たとえば、削除を許可する場所)、またはその両方 (私の場合) がある場合$index、バックエンドの間違ったインデックスになるため、使用は機能しません。ngInitリストが変更されたときに再評価されないため、値をキャッシュするために並べ替えて使用した後のデータも機能しません。

マイルのソリューションでは、パラメーターを渡すことで、添付されたインデックス プロパティ名をカスタマイズできることに注意してください。<tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">

私の微調整バージョン:

.filter( 'repeatIndex', function repeatIndex()
{
// This filter must be called AFTER 'filter'ing 
//  and BEFORE 'orderBy' to be useful.
    return( function( array, index_name )
    {
        index_name = index_name || 'index';
        array.forEach( function( each, i )
        {each[ index_name ] = i;});
        return( array );
    });
})
于 2014-08-06T18:45:43.057 に答える