Открыть ngDialog по нажатию кнопки из директивы
У меня есть кнопка в моем directive
это должно открыть конфигурацию ngDialog
,
Вот мой код для theme.html
директива:
<div class="col-lg-3 col-md-6">
<div class="panel panel-{{colour}}">
<div class="panel-heading">
<div class="row">
<div class="col-xs-3">
<i class="fa fa-{{type}} fa-5x"></i>
</div>
<div class="col-xs-9 text-right">
<div class="huge">{{name}}</div>
<div>{{comments}}</div>
</div>
</div>
</div>
<div class="panel-footer">
<div class="ngdialog-buttons btn-toolbar">
<button type="button" ng-dialog-controller="MainCtrl" class="ngdialog-button btn btn-primary pull-right" ng-click="openConfigWindow('theme')">Settings</button>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
theme.js
angular.module('adminApp')
.directive('theme',function() {
return {
templateUrl:'scripts/directives/theme/theme.html',
restrict:'E',
replace:true,
scope: {
'model': '=',
'comments': '@',
'name': '@',
'colour': '@',
'details':'@',
'type':'@',
'goto':'@',
'status':'@'
/*hooking this event invokes the ngClick, but not on the button*/
//eventHandler: '&ngClick'
}
}
});
Вот как theme
Директива используется в html
:
<div class="panel-body" data-ng-controller="MainCtrl">
<theme name="test" comments="New comments!" colour="info" type="sample" status="Deactivate"></theme>
</div>
main.js
содержит MainCtrl
контроллер:
angular.module('adminApp')
.controller('MainCtrl', function($scope,$position,$rootScope, ngDialog) {
$scope.openConfigWindow = function (themeName) {
$rootScope.theme = themeName;
ngDialog.open({
template: '/views/configPopup.html',
controller: 'InsideCtrl',
className: 'ngdialog-theme-default dialogDimension',
closeByDocument: false
});
};
})
openConfigWindow
не вызывается, как я должен связать ng-click
на кнопку внутри моей директивы темы?
3 ответа
В вашей директиве вам нужно добавить обратный вызов (он у вас почти был, но он был больше похож на обработчик событий, чем на то, как это обычно делает NG). Чтобы передать параметры обратно в выражение обратного вызова, в котором реализована директива, вы можете прочитать больше здесь. Может ли угловая директива передавать аргументы функциям в выражениях, указанных в атрибутах директивы?
директива
angular.module('adminApp')
.directive('theme',function() {
return {
templateUrl:'scripts/directives/theme/theme.html',
restrict:'E',
replace:true,
link: function( $scope, elem, attrs){
$scope.openRqst = function(theme){
$scope.openConfig({theme:theme}) //notice how I'm passing the theme param to the callback.
}
},
scope: {
'model': '=',
'comments': '@',
'name': '@',
'colour': '@',
'details':'@',
'type':'@',
'goto':'@',
'status':'@',
'openConfig': '&'
}
}
});
кнопка запуска шаблона директивы
<button type="button" ng-dialog-controller="MainCtrl" class="ngdialog-button btn btn-primary pull-right"
ng-click="openRqst('theme')">Settings</button>
реализация
<theme name="test" comments="New comments!" colour="info" type="sample" status="Deactivate" open-config="openConfigWindow(theme)"></theme>
openConfigWindow
должен быть представлен в функции ссылки директивы вместо содержащей области. Проблема в том, что ваша директива имеет изолированную область видимости и поэтому не может видеть модель своего родителя.
Что-то вроде:
link: function (scope, element, attrs) {
scope.openConfigWindow = function() {}
}
Кроме того, я не очень знаком с ngDialog, но, используя модальный angular-ui (который, как я знаю, очень похож на ngDialog), вы можете передать область видимости в свой модал, указав параметр scope для модальной реализации. Передача информации через $rootScope
не очень хорошая идея
Я никогда не слышал о такой вещи, как ng-dialog-controller, чтобы связать контроллер с вашей директивой, используя опцию controller, так что..
angular.module('adminApp')
.directive('theme',function() {
return {
templateUrl:'scripts/directives/theme/theme.html',
restrict:'E',
replace:true,
controller: 'MainCtrl',
.............
.........
}
}
});