2017-02-07 1 views
0

Wir verwenden Angular 1.4.2 und ich versuche, einen Zählwert aus einer Direktive mit ng-Klick zu nehmen, übergeben Sie es an eine Funktion, und übergeben Sie es dann an den übergeordneten Controller. Nach einiger Anstrengung funktioniert es in einem Plunker, aber leider, als ich versuchte, diese Funktionalität zurück in den Hauptcode zu verschieben, bin ich nicht in der Lage, einen Controller zu bekommen, um an den isolierten Bereich zu binden.Wie bindet man ng-click an eine benutzerdefinierte Anweisung und ruft eine Elternfunktion auf?

Sollte einfach sein, aber ich habe versucht, den aktuellen Controller in die Direktive injizieren und versuchen, einen neuen Controller zu erstellen, aber nichts passiert, wenn ich auf die Schaltfläche klicken. Hier

ist der Code:

TEMPLATE:

<!DOCTYPE html> 
<html> 

    <head> 
    <script data-require="[email protected]" data-semver="1.4.2" src="https://code.angularjs.org/1.4.2/angular.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="script.js"></script> 
    </head> 

    <body> 
    <div id="app" ng-app="app"> 
    <div ng-controller="mainCtrl"> 
      <my-directive ctrl-fn="ctrlFn(count = count + 10)"></my-directive> 
     </div> 
     </div> 
    </body> 

</html> 

SCRIPT:

var app = angular.module('app', []); 
app.controller('mainCtrl', function($scope){ 
    $scope.count = 0; 
    $scope.ctrlFn = function() { 
     console.log('In mainCtrl ctrlFn!'); 
     //$scope.count += 10; Old hardcoded value. 
     console.log("count is: " + JSON.stringify($scope.count)); 
    //Call service here 
    }; 
}); 

app.directive('myDirective', function() { 
    return { 
    restrict: 'E', 
    scope: { 
     'ctrlFn' : '&' 
    }, 
    template: "<div><button ng-click='ctrlFn()'>Click Here</button></div>", 
    link: function(scope, element, attributes) { 
     scope.ctrlFn(count); 
    } 
    }; 
}); 

Hier ist der Template-Code Ich versuche, in dem Haupt-Code zu ändern Basis:

<div> 
    <div layout="row"> 
     <results-loader ctrl-fn="ctrlFn(count = count + 10)"></results-loader> 
     <md-button class="md-raised md-primary md-button" ng-click="ctrlFn()" flex>Click Me</md-button> 
    </div> 
</div> 

und hier ist, wo ich einen vorhandenen Controller in meiner Direktive als Eltern-Controller verwenden. Es ist in einer Route definiert und nicht in ng-controller und wird bereits für diese Ansicht verwendet.

aber es ist offenbar nicht ordnungsgemäß gebunden, wie ich nie die Richtlinie oder diese Funktion mit ng-klicken.

Wie gesagt, ich habe versucht, einen neuen Controller zu der Vorlage hinzuzufügen, dann habe ich versucht, einen vorhandenen Controller in die Richtlinie zu injizieren, aber keiner von beiden hat funktioniert. Ich nahm die Vorlage aus der Direktive heraus und versuchte, den ng-Klick mit ctrl-fn direkt in die Vorlage zu setzen, aber ich war mir nicht sicher, wie ich den Klick mit dem Aufruf des ctrl-fn-Attributs der Direktive verbinden sollte beide in der Vorlage? Die Idee hier ist, die Vorlage in eine eigene HTML-Datei zu verschieben und sie von der Direktive aus zu referenzieren, wie in: template: "myFile.html. Ich versuche so viel wie möglich zu entkapseln, um dies in eine wiederverwendbare Komponente zu verwandeln.

habe ich mit benutzerdefinierten Richtlinien nicht viel gearbeitet.

Hier ist der Link zu den plunker ist.

Antwort

0

Ich ziehe es nicht meine eigenen Fragen zu beantworten, wie eine negative Erscheinung hat, aber in diesem Fall, ich weiß nicht Ich weiß, ob ich die Frage gut genug hätte erklären können, um die richtige Antwort zu bekommen. Was mich abwarf, war die Integration meines Code in die bestehende Code-Basis.

Wo ich stecken geblieben war, wie man den Controller für diesen Anwendungsfall richtig einrichten. Obwohl ich meinen Controller im Modul deklarierte und den Controller injizierte, da er bereits an diese Ansicht gebunden war, musste ich den Controller in der Direktive selbst definieren. Nachdem ich alle drei zusammen gemacht hatte, fing alles an zu arbeiten.

Hier sind einige Code-Schnipsel:

angular.module('directiveName', []) 
     .directive('directiveName', directiveName) 
     .controller('injectedCtrl', injectedCtrl) 
     etc... 

var directive = { 
     restrict: 'E', 
     scope: { 
      'ctrlFn' : '&' 
     }, 
     template: "<div><button ng-click='ctrlFn()'>Click Here</button></div>", 
     controller: "injectedCtrl", 
     link: function(scope, element, attributes) { 
      scope.ctrlFn(); //This will pass to the parent controller: injectedCtrl, where $scope resides. 
     } 
    } 
    return directive; 
} 


injectedCtrl.$inject = ['$scope', 'myService']; 
    /* @ngInject */ 
    function injectedCtrl($scope, myService) { 
    $scope.ctrlFn = function() { 
     //do something 
    } 
    etc... 

HTML-Code:

Wenn die Taste von der Richtlinie angeklickt wird, ctrlFn hier ist eine Referenz, die unter meinen Richtlinien isoliert Umfang im DDO ist . Dies übernimmt die externe Funktion, die übergeben wurde, nämlich: ctrlFn(), die dann von der Anweisung aufgerufen werden kann, um den übergeordneten Controller aufzurufen.

Ich poste dies, um jemand anderem zu helfen, der diesen Anwendungsfall haben könnte, da es nicht einfach war, dies herauszufinden.

Dah Wahlins Beitrag geht genauer auf dieses Thema ein: Creating Custom AngularJS Directives Part 3 - Isolate Scope and Function Parameters und was half, mein Denken geglättet zu bekommen.

0

ich weiß nicht, Ihre genaue Zuordnung, aber Ihre Architektur zu überdenken. Warum wollen Sie die zählen möchten Wert in der Direktive? In Ihrem einfachen Fall wäre es besser, den Wert in einem Service oder in der Steuerung zu zählen, nicht in einer Richtlinie.

Injektor-Controller in der Richtlinie ist Anti-Winkel-Muster. Sie müssen Ihre Absichten überdenken. Es ist besser, die Nummer an die Direktive zu übergeben, dort Ihre Berechnungen durchzuführen und Ihre Nummer an den Controller zurückzusenden. Es würde ohne zusätzlichen Code wegen der Zwei-Wege-Datenbindung funktionieren. Hier eine Gabel Ihrer Plunker: http://plnkr.co/edit/KpB6bv5tHvXSvhErLcEp?p=preview Hauptteil ist die Definiton der Richtlinie: <div><span>{{count}}</span><br /><button ng-click='myFunction()'>Calculate</button></div>

+0

Ich brauche die Anzahl jedes Mal, wenn der Benutzer auf eine Schaltfläche klickt, um eine festgelegte Anzahl von Ergebnissen zurückzugeben. Wenn es die Seite lädt, zeigt es 10 Ergebnisse, wenn sie klicken, zeigt es diese 10 + 10 mehr, wenn der Klick wieder 10 + 10 + 10 oder 30 zeigt. Ich rufe einen Dienst an, um die Ergebnisse zu ziehen, nachdem ich den Wert übergeben habe an den übergeordneten Controller. –

Verwandte Themen