Reputation: 3125
I'm having some trouble using a Factory function inside my nested Directives.
The main code is working, because it was tested on Controller. All my JavaScript files are loaded at the beginning.
This is the scenario:
I access todoController.js using routes, then it calls the taskList Directive, which calls the task Directive.
I'm trying to implement this code(modalService.js):
(function(angular) {
gameOnApp.directive('modalButton', function($compile) {
return {
restrict: 'A',
priority: 1001,
terminal: true,
compile: function(elm, attrs) {
elm.attr('ng-click', "modal.openModal('" + attrs.modalId + "')");
elm.removeAttr('modal-button');
elm.removeAttr('modal-id');
var fn = $compile(elm);
return function(scope){
scope.modal = Modal;
fn(scope);
};
}
}
});
gameOnApp.factory('Modal', function(){
return {
openModal: function(modalId) {
console.log(modalId);
}
}
});
})(window.angular);
And on my HTML I call it like this:
<li>
<span modal-button modal-id="12"><i class="fa fa-edit fa-fw"></i> Edit</span>
</li>
The HTML responses is:
<li>
<span ng-click="modal.openModal('12')"><i class="fa fa-edit fa-fw"></i> Edit</span>
</li>
And the task Directive with the modal code:
gameOnApp.directive('task', function($compile, Modal) {
return {
restrict: 'E',
scope: false,
templateUrl: 'app/components/todo/taskView.html',
compile: function(elm, attrs){
return function(scope){
scope.modal = Modal;
}
}
};
});
And I know that it's not working because task Directive is not recognizing the ng-click function from Modal Directive.
How can I solve this?
Upvotes: 0
Views: 147
Reputation: 3125
I've solved it by using the AngularJS way.
Rewriting modalService.js to:
(function(angular) {
gameOnApp.directive('modalButton', function($compile, Modal) {
return {
restrict: 'A',
priority: 1001,
terminal: true,
compile: function compile(elm, attrs, transclude) {
return function postLink(scope, iElement, iAttrs, controller) {
iElement.attr('ng-click', "modal.openModal('" + attrs.modalId + "')");
iElement.removeAttr('modal-button');
iElement.removeAttr('modal-id');
scope.modal = Modal;
var fn = $compile(iElement);
fn(scope);
}
}
}
});
gameOnApp.factory('Modal', function(){
return {
openModal: function(modalId) {
console.log(modalId);
}
}
});
})(window.angular);
Using compile function and postLink, it keeps the ng-click attribute, as if it was always there.
And, I just needed to clean my task Service:
gameOnApp.directive('task', function($scope) {
return {
restrict: 'E',
templateUrl: 'app/components/todo/taskView.html'
};
});
Upvotes: 1