¿Cómo exponer el comportamiento de una directiva con alcance aislado?

¿Cómo puedo exponer un método desde una directiva? Sé que debo usar atributos para datos, pero realmente quiero exponercomportamientonodatos. Algo que el controlador padre puede llamar.

Digamos que mi DOM se ve como:

<div ng-app="main">
    <div ng-controller="MyCtrl">
        <button ng-click="call()" >Call</button>
        <div id="container" my-directive> </div>
    </div>
</div>

JavaScript:

angular.module("main", []).controller("MyCtrl", function($scope) {
    $scope.call = function() {
        $scope.myfn();
    };
}).directive("myDirective", function() {
    return {
        // scope: {},
        controller: function($scope) {
            $scope.myfn = function() {
                console.log("myfn called");
            }
        }
    };
});

jsFiddle:http://jsfiddle.net/5gDjQ/7/

Si elscope está comentado (es decir, la directiva no tiene un alcance aislado), funciona bien. Cuando presiono el botón,myfn Se llama y se registra en la consola.

Tan pronto como me descomentescope, no funciona.myfn se define en el ámbito secundario y no está fácilmente disponible para el padre.

En mi caso, creo que contaminar el ámbito de los padres es una mala idea y realmente me gustaría evitarlo.

Entonces, ¿cómo puedo exponer una función de la directiva al controlador principal? O: ¿Cómo puedo invocar un método en directivas desde el controlador principal?

Respuestas a la pregunta(5)

Su respuesta a la pregunta