entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

llamar un método de Controller desde una Directive sin usar $scope

Tengo una función que actuara como un Controlador (lo manejo asi para los métodos privados):

function micontrolador($http){
    var self = this;

    self.metodoCoqueto = function(str){
       console.log(str + _privado());
    }

    function _privado(){
       return $http.get();
    }
}

Ahora inyecto el controlador a angularJS:

angular.module('Academica')
    .controller('MiControlador',[
        '$http',
        micontrolador
    ])

Pero tambien quiero mi directiva coqueta:

.directive('mibonitadirectiva', function(){
        return {
            restrict: 'E',
            template: '<button>Hola mundo</button>',
            //controller: ['$http', function($http){}],  //esto no lo implemente por que queria mi controller aparte de la DIRECTIVA
            controller: 'MiControlador',
            link: function(scope, element, attrs){
                var $element = $(element);

                $element.on('click', function(){
                        //***
                        ¿COMO LLAMO AL Método de mi controllador sin scope?

                        Intentos fallidos: 
                             -- MiControlador.metodoCoqueto('boo');
                             -- algo con $eval
                        */
                });
            }
        };
    });

Ahi el problema, hice un "parche"

$scope.metodo = self.metodo;  //método fuchi :(

Y pues se me hace algo sucio, lo que pasa es que prefiero llamar a Controller.method() pues es mas legible en una bola de marañas de código, que funciona bien, pero cuando quieres retomar algo pasado.. no sabes ni a donde esta llamando.

Saludos y gracias por el apoyo

1 Respuesta

3votos

white Puntos75880

Hola @elporfirio, en la función link, el cuarto parametro es el controlador.

function link (scope, element,
               attrs, controller /* yes! our hero is here! */ ) {

}

entonces supongamos que tenemos nuestro controlador:

(function() {
    'use strict';

    angular
        .module('app')
        .controller('MyController', MyController);

    MyController.$inject = ['$scope'];

    function MyController($scope) {
        /*jshint validthis: true */
        var vm = this;

        vm.awesomeMethod = function() {
            console.log('awesome method is here :D?');
        };
    }

})();

en la directiva podriamos llamar a awesomeMethod de esta forma:

(function() {
    'use strict';

    angular
        .module('app')
        .directive('awesomeDirective', awesomeDirective);

    awesomeDirective.$inject = [];

    function awesomeDirective() {
        var directive = {
            restrict: 'E',
            template: '<strong>hello world</strong>',
            scope: {},
            controller: 'MyController',
            link: link
        };
        return directive;

        ////////////////////////////

        function link(scope, element, attrs, controller) {
            controller.awesomeMethod();
        }
    }

})();

saludos!

1voto

elporfirio comentado

No puede ser, horas desperdiciadas...

Y si estaba hasta el final de la documentación, muy bien señor White me salvaste la vida :)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta