vvovas
@vvovas

Как правильно передать функцию контроллера в директиву второго уровня в AngularJS?

Есть следующая разметка:
<div ng-controller="ClientsCtrl">
    <table-panel data="data" action-delete="client_delete(id)">
        ...
        <data-table rows="rows" action-delete="???">
            ...
            <table>
                <tbody>
                    <tr ng-repeat="row in rows">
                        <td>
                            <a ng-click="entity_delete(row.id)">Delete</a>
                        </td>
                    </tr>
                </tbody>
            </table>
            ...
        </data-table>
        ...
    </table-panel>
</div>


где, table-panel и data-table - директивы.
Т.е. есть страница с панелью, в панели таблица с данными, у строки есть кнопка удалить. Таблица и панель сделаны директивами, чтобы можно было использовать на разных страницах, для разных данных.
Что должно происходить по нажатию на кнопку удалить, описано в контроллере ClientsCtrl.

Код директив:
controls.directive('tablePanel', function () {
    return {
        restrict: 'E',
        scope: {
           actionDelete: '&'
        }
    }
});

controls.directive('dataTable', function(){
    return {
        restrict: 'E',
        scope:{
            actionDelete: '&'
        },
        controller: function($scope){
            $scope.entity_delete = function (id) {
                $scope.actionDelete({id: id});
            };
        }
    };
});


Что нужно написать в разметке в строке <data-table rows="rows" action-delete="???"> в атрибуте action-delete?
Если написать actionDelete(id), то получим ошибку при нажатии на кнопку:
Cannot use 'in' operator to search for 'client_delete' in 1

Если я правильно понимаю, то можно создать метод в контроллере директивы tablePanel и ставить ссылку уже на него.
Вопрос в том, можно ли обойтись без создания метода, который просто будет дергать другой метод?
  • Вопрос задан
  • 3998 просмотров
Пригласить эксперта
Ответы на вопрос 1
Из простых вариантов: используйте определение контроллера в нотации ng-controller="Controller as controllerName", и обращайтесь к методу контроллера напрямую.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы