2016-08-05 29 views
1

ich eine Richtlinie ähnlich wie diese dieses:Rebinding dies auf Winkel Rückruf von innen Link funtion

app.directive('example', function() { 
    return { 
    restrict: 'E', 
    transclude: true, 
    scope: { 
     callback: '&' 
    }, 
    template: '<span ng-click="example.callback()">Click Me</span>', 
    bindToController: true, 
    controllerAs: 'example', 
    controller: function() { 
     this.counter = 0; 

     this.incrementCount = function() { 
     this.counter++; 
     }; 

     this.getCount = function() { 
     return this.counter; 
     }; 
    }, 
    link: function(scope, el, attrs, ctrl) { 
     var oldCallback = scope.callback; 
     ctrl.callback = function() { 
     console.log(ctrl); 
     return oldCallback.call(ctrl); // I want to be able to use `this` as the controller to access the API from within the callback 
     }; 
    } 
    }; 
}); 

mit einem Controller

app.controller("ctrl", ["$scope", function(s) { 
    s.callback = function() { 
    this.incrementCount(); 
    console.log("Value: " + this.getCount()); 
    }; 
}]); 

Und Ansicht

<div ng-app="app"> 
    <div class="container" ng-controller="ctrl"> 
    <example callback="callback()"></example> 
    </div> 
</div> 

(codepen)

Whe n ich log ctrl innerhalb der ctrl.callback in der link-funktion protokolliert es die beispiel controller wie ich erwarte, aber wenn oldCallback aufgerufen wird, wird es nicht ctrl rebound zu this wie ich will. Gibt es eine Möglichkeit, auf die API zuzugreifen, die im Controller der Direktive innerhalb des Rückrufs für den Bereich definiert ist, während weiterhin ein isolierter Bereich für die Richtlinie verwendet wird?

+0

Warum die Link-Funktion überhaupt verwenden? Sie sollten in der Lage sein, $ scope an den Controller zu übergeben und von dort auf $ scope.callback zuzugreifen. –

+0

In der aktuellen Direktive verwende ich Link, um den Callback so zu dekorieren, dass er "true" zurückgibt, es sei denn, es gibt explizit den Wert "false" für die Flusskontrolle zurück. – konapun

Antwort

1

Sie könnten den Direktiven Controller durch den Rückruf übergeben. z.B.

Beispiel html

<span ng-click="example.callback({$exampleCtrl:example})">Click Me</span> 

Index html

<example callback="callback($exampleCtrl)"></example> 

Controller

$scope.callback = function($exampleCtrl) { 
    $exampleCtrl.incrementCount(); 
    console.log("Value: " + $exampleCtrl.getCount()); 
}; 

http://codepen.io/anon/pen/BzqqzV

Beachten Sie auch, dass bindToController wird nur in AngularJs 1.3+ unterstützt und Ihr Code-Stift verwendet 1.2

+0

Großartig, das tut genau das, was ich brauche. Ich hatte anfangs versucht, ein Argument durch die Vorlage zu übergeben, aber ich denke, ich hatte die Syntax falsch. – konapun

+0

ja die Syntax dafür ist ein bisschen komisch. Aber es funktioniert – rob