2
I’m trying to make from an event in a Directive, is called a method belonging to a Controller, the Controller method call is already correct, only it seems that the $scope, within that method is wrong, for if the $scope.file.data from the call of the Directive event he up to arrow the value, but does not update the View, already if the $scope.file.data from the event of ng-click in div Controller, everything happens as expected.
What I’m trying to do is this:
var app = angular.module('myApp', []);
app.controller('myController', function($scope) {
$scope.file = {
data: "nada!"
};
$scope.setExternal = function(data) {
console.log(data);
$scope.file.data = data;
};
});
app.directive('myDirective', function() {
return {
restrict: 'A',
scope: {
setOnClick: '&'
},
link: function(scope, element, attrs) {
element.on("click", function() {
scope.setOnClick({
param: "Clicou na directive!"
});
});
}
};
});
body {
margin: 0px;
}
.box {
padding: 25px 0px;
border: 2px dashed #bbb;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
text-align: center;
font: 20pt bold'Vollkorn';
color: #bbb;
margin: 10px 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp">
<div ng-controller="myController">
{{file.data}}
<div class="box" ng-click="setExternal('Clicou na div!')">
Está é uma Div do controller. Clique aqui!
</div>
<div class="box" my-directive set-on-click="setExternal(param)">
Está é a Directive. Clique aqui!
</div>
</div>
</div>
What I can is failing to do so that call from the Directive:
element.on("click", function() {
scope.setOnClick({
param : "Clicou na directive!"
});
});
have a $scope valid as the ng-click of div?
Note: in my real case the event in Directive is not a simple
click, a slightly more complex process. I used an example with click for didactic and practical purposes.
Um, so Scope, that’s right? What happens is that it’s not applying the changes in the View and the
$apply()does this. Right? Interesting but strange =(. And regarding the tip: as I do not know very well angular, I did not understand if what I am doing is correct, or is wrong, starting from your tip? I think that’s right, because I’m using$scopefor data passing only.– Fernando Leal
Yes, just missed the
$apply. For some reason Angular not doing Dirty check. Using$apply, we force this. Note that Angular does not allow nested calls to$applyand that Angular itself uses$applyto perform the Dirty check. About the use of the$scope, in your guideline is correct, but in your controller, the correct one would be to usethis.file = ...andthis.setExternal = ..., for example. You need to change the calls in your view to make it work, and you need to give the controller a nickname (ng-controller='myController as apelido').– Vinícius Gobbo A. de Oliveira
Don’t worry, the Angular doc is not very clear about this. In version 2, they are making explicit the mode to use
$scope, including the possibility to cease to exist and be automatically manipulated by Angular (version 2 has not yet been fully defined its architecture, but will not be compatible with version 1 at all).– Vinícius Gobbo A. de Oliveira