サーバーからのデータを HTML テーブルに表示するディレクティブを作成しています。djlist
directive('djlist', function(urls) {
return {
restrict: 'ACE',
templateUrl: urls.list_objs_template,
scope: {},
controller: ['$scope', '$resource',
function($scope, $resource) {
$scope.objs = $resource(urls.list_objs);
$scope.objs_api = $resource(urls.list_objs_api);
$scope.data = $scope.objs.get();
}
]
};
})
サーバーからのデータは で表示されますng-repeat
。データ配列内の各オブジェクトには、別のディレクティブである削除ボタンが関連付けられています。djdel
<div class="row panel panel-primary">
<h3 class="panel-heading">Data from REST</h3>
<div class="panel-body">
<table class="table">
<tr>
<th>Content</th>
<th>Date Created</th>
<th>Action</th>
</tr>
<tr ng-repeat="d in data.objects">
<td>{{ d.content }}</td>
<td>{{ d.date }}</td>
<td>
<djdel ng-click="del($index)" model-pk="d.id"></djdel>
</td>
</tr>
</table>
</div>
</div>
これが私が定義する方法ですdjdel
directive('djdel', function() {
return {
restrict: 'ACE',
template: '<button class="btn btn-danger btn-small">Delete</button>',
scope: {
modelPk: '='
}, controller: ['$scope', '$http', '$resource',
function($scope, $http, $resource) {
$scope.del = function(index) {
var $parent = $scope.$parent.$parent;
$parent.objs_api.
remove({id: $scope.modelPk}, function() {
$parent.data.objects.splice(index, 1);
});
};
}
]
};
}).
これは機能します。ただし、 で開始されたオブジェクトがサーバーから正常に削除された後、 にdjdel scope
あるデータ コレクションを更新する方法が必要djlist scope
です。スコープ階層はdjlist > ng-repeat > djdel
、したがって$scope.$parent.$parent
、データ コレクションを参照する場合です。
スコープチェーンの非常に多くのレベルを参照しないようにする方法はありますか?