Mit isolate scope scheint die Vorlage der Direktive nicht in der Lage zu sein, auf die Variable $ rootScope des Controllers ('Ctrl') zuzugreifen, die jedoch im Controller der Direktive angezeigt wird. Ich verstehe, warum die $ scope-Variable des Controllers ('Ctrl') im isolierten Bereich nicht sichtbar ist.
HTML:
<div ng-app="app">
<div ng-controller="Ctrl">
<my-template></my-template>
</div>
<script type="text/ng-template" id="my-template.html">
<label ng-click="test(blah)">Click</label>
</script>
</div>
JavaScript:
angular.module('app', [])
.controller('Ctrl', function Ctrl1($scope, $rootScope) {
$rootScope.blah = 'Hello';
$scope.yah = 'World'
})
.directive('myTemplate', function() {
return {
restrict: 'E',
templateUrl: 'my-template.html',
scope: {},
controller: ["$scope", "$rootScope", function($scope, $rootScope) {
console.log($rootScope.blah);
console.log($scope.yah);,
$scope.test = function(arg) {
console.log(arg);
}
}]
};
});
Auf die Variable wird ohne isolierten Bereich zugegriffen - wie aus dem Kommentar der isolierten Bereichszeile hervorgeht:
// scope: {},
javascript
angularjs
angularjs-directive
camden_kid
quelle
quelle
directive('myTemplate', function($rootScope) { ... })
?Antworten:
Sie können diesen Weg mit ausprobieren
$root.blah
Arbeitscode
html
Javascript
quelle
Im Allgemeinen sollten Sie vermeiden
$rootScope
, Werte zu speichern, die Sie zwischen Controllern und Direktiven teilen müssen. Es ist wie mit Globals in JS. Verwenden Sie stattdessen einen Dienst:Eine Konstante (oder Wert ... Verwendung ist ähnlich):
https://docs.angularjs.org/api/ng/type/angular.Module
Eine Fabrik (oder ein Dienst oder ein Anbieter):
Hier ist eine Gabelung Ihrer Geige, die zeigt, wie Sie beide verwenden können
quelle
1) Aufgrund des isolierten Bereichs
$scope
in Ihrem Controller Ctrl und in der Direktive verweist Controller nicht auf denselben Bereich - sagen wir, wir haben scope1 in Ctrl und scope2 in der Direktive.2) Wegen des isolierten Bereichs erben scope2 nicht prototypisch von
$rootScope
; Wenn Sie also definieren,$rootScope.blah
dass es keine Chance gibt, können Sie es in scope2 sehen .3) Auf was Sie in Ihrer Direktivenvorlage zugreifen können, ist scope2
Wenn ich es zusammenfasse, hier ist das Vererbungsschema
quelle
Ich weiß, dass dies eine alte Frage ist. Meine Befragung darüber, warum der isolierte Bereich nicht auf Eigenschaften im $ Rootscope zugreifen kann, wurde jedoch nicht befriedigt.
Also grub ich mich in die eckige Bibliothek und fand -
Dies ist die Funktion, die von angle aufgerufen wird, wenn ein neuer Bereich erstellt wird. Hier ist klar, dass ein isolierter Bereich das Rootscope nicht prototypisch erbt. Vielmehr wird im neuen Bereich nur das Rootscope als Eigenschaft '$ root' hinzugefügt. Daher können wir nur über die Eigenschaft $ root im neuen isolierten Bereich auf die Eigenschaften von Rootscope zugreifen.
quelle