4

サーバーからのデータを 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、データ コレクションを参照する場合です。

スコープチェーンの非常に多くのレベルを参照しないようにする方法はありますか?

4

2 に答える 2

6

require親コントローラーは次のことができますdjdel

directive('djdel', function() {
    return {
        ...
        require: "^djlist",
        ...
        link: function(scope, elem, attrs, djlistController) {
            // the controller function does not have access to the required
            // controllers, so we just inject htem in the scope
            scope.djlistController = djlistController;
        },
        controller: ['$scope', '$http', '$resource', 
            function($scope, $http, $resource) {
                // you can access members of the djlistController as
                $scope.djlistController.XXX();
                ...
            }]
    };
});

必要な機能を(NOT TO THE )にdjlist追加します。this$scope

directive('djlist', function(urls) {
    ...
    controller: ['$scope', '$resource',
        function($scope, $resource) {
            this.XXX = function() {
                // you can also add variables here
            };
            ...
        }]
    ...
});
于 2013-11-12T10:53:15.857 に答える
0

アプリケーションの でいつでもイベントの発行を試すことができ$rootScopeます。

$rootScope.$broadcast("nameOfTheEvent", paramsToSend);

サーバーから何かを消去した直後に

$rootScope.$on("nameOftheEvent", function(paramsToRecieve) { refreshList();});

もちろん、paramsToRecieve は paramsToSend であり、任意のオブジェクトにすることができます。

于 2013-11-12T10:50:31.163 に答える