2014-02-12 18 views
44

ich diese Frage bin frage, weil ich nicht ganz klar bin, wie von rootscope als Abhängigkeit Richtlinien bestanden

Ich habe eine Richtlinie zu denken, dass einige Informationen von $ angezeigt werden muss rootScope ...

Ich dachte, ich müsste das $ rootScope an eine Direktive übergeben, aber wenn ich eine Direktive schreibe, scheint es zu funktionieren.

.directive("myBar", function() { 
return { 
    restrict: "E", 
    transclude: true, 
    replace: true, 
    template: '<div>' + 
       '<span ng-transclude></span>' + 
       '{{rsLabels.welcome}} {{rsUser.firstName}}!' + 
       '</div>' 
} 
}) 

Wann muss ich dies tun müssen?

.directive("myBar", function ($rootScope) { 
return { 
    restrict: "E", 
    transclude: true, 
    replace: true, 
    template: '<div>' + 
       '<span ng-transclude></span>' + 
       '{{rsLabels.welcome}} {{rsUser.firstName}}!' + 
       '</div>' 
} 
}) 

Kann ich und wie verwende ich rootScope, wenn ich es in der Link-Funktion der Richtlinie müssen - oder soll ich tun es in der Steuerung der Richtlinie?

.directive("myBar", function ($rootScope) { 
return { 
    restrict: "E", 
    transclude: true, 
    replace: true, 
    link: function (scope, element, attrs, rootScope) { 
     rootScope.rsUser = { firstName: 'Joe' }; 
     rootScope.rsUser = { welcome: 'Welcome' }; 
    }, 
    template: '<div>' + 
       '<span ng-transclude></span>' + 
       '{{rsLabels.welcome}} {{rsUser.firstName}}!' + 
       '</div>' 
} 
}) 

Meine rootScope Daten in Lauffunktion

.run(function ($rootScope) { 

    $rootScope.rsLabels = { 
     welcome: 'Welcome' 
    }; 

    $rootScope.rsUser = { 
    firstName: 'Joe' 
    }; 
}); 

Danke definiert ist!

Antwort

47

Von meinen experiments \ experience, scheint es, dass, da alle $ scopes letztlich von $ rootScope erben, Sie auf Daten darauf zugreifen können, ohne es als einen Dienst zu fordern, gemäß Standard-JavaScript-prototypischen Vererbungsregeln. Wenn Sie die Eigenschaft scope in Ihrer Anweisung auf false oder {} setzen, werden Sie feststellen, dass Sie nicht mehr darauf zugreifen können.

.directive("myBar", function($rootScope) { 
    return { 
     restrict: "E", 
     scope: { /* Isolate scope, no $rootScope access anymore */ }, 
     transclude: true, 
     replace: true, 
     template: '<div>' + 
        '<span ng-transclude></span>' + 
        '{{rsLabels.welcome}} {{rsUser.firstName}}!' + 
        '</div>' 
    }; 
}); 

Beispiel: http://jsbin.com/bequy/1/edit

+1

ah! Ich verstehe. Wie Kurt darauf hingewiesen hat, ist dies nicht der beste Weg, die Eigenschaften der App in eckig zu setzen, aber ich musste das rootScope verstehen und dies erklärt es besser. Vielen Dank. Wissen Sie nicht, wie auf den $ root-Bereich in der Link-Funktion der Direktive zugegriffen werden soll? – GRowing

+3

Sie müssen sich $ rootScope als den globalen Namespace vorstellen und vermeiden, ihn zu überladen. Sie können es in Ihre Direktive injizieren, aber der Hauptpunkt von Direktiven ist eine Komponente ohne zu viele externe Abhängigkeiten. Wenn Sie etwas von $ rootScope benötigen, können Sie es in einen Service umgestalten. –

+0

Es macht Sinn. Ich nehme an, dass ich darauf zurückgriff, irgendein kin dof zu verwenden, das äquivalent zu globals ist, weil ich x jederzeit verfügbar haben muss und nicht weiß, wie ich es sonst angehen könnte. Ich benutze localStorage für einige Sachen, aber jetzt schaue ich auf cacheFactory und die erweiterte Version davon, und wie sie localstorage verwenden, sehe ich das Licht. Vielen Dank! – GRowing

7

Es wird nicht empfohlen, den Stammbereich zum Festlegen und Abrufen von Eigenschaften in Ihrer eckigen Anwendung zu verwenden. Versuchen Sie, die $ cacheFactory zu verwenden, da Sie auf diese Weise auch einige Werte über verschiedene Anfragen zwischenspeichern können. ($cacheFactory docs)

+0

Ja, dachte ich, $ rootScope mit wie diese nicht die besten Ideen. Danke für den Vorschlag übrigens. Ich bin auf der Suche nach besseren Möglichkeiten, um weithin zugängliche Objekte zu erstellen, die ich jedoch aus verschiedenen Direktiven verwenden kann. Ich finde, dass die Dokumentation über eckige Seiten völlig nutzlos ist (wie ein Großteil dieser Seite), weil sie nichts erklärt, was keinen echten Anwendungsfall oder zumindest logische Anwendungsfälle zeigt. In meinem Fall müssen alle Direktiven auf der Site jederzeit Zugriff auf Benutzerinformationen und einige andere Informationen haben. Bester Weg? Kennst du nützlich? gute Dokumentation vielleicht? – GRowing

+0

Hey, ich habe einige gute Infos dazu gefunden und dazu http://jmdobry.github.io/angular-cache/guide.html und ein nützliches YT-Video .. Danke für diesen Tipp! Ich schätze es sehr :) und ich denke, ich werde mich genauer damit beschäftigen, wie ich tatsächlich an dem arbeite, woran ich gerade arbeite. Mike hat jedoch meine Frage mit einer Erklärung angesprochen, so dass ich seine Antwort als die richtige Antwort markieren werde. – GRowing

59

Sie auf diese Weise tun können:

{{$root.rsLabels.welcome}} 
+22

Danke, hat das nicht getan. Ich benutze 'link: function (scope, ...) {scope. $ Root}' um von einer Direktive auf '$ rootScope' zuzugreifen. – ivkremer

+0

Das ist das gleiche – karaxuna

+0

Ja, ich meine googlen für den Zugriff auf die $ rootScope von Direktive und ich wusste nicht über die $ root-Eigenschaft. Danke für die Antwort. – ivkremer

3

Nach arbeitend weg auf dieser gleichen Frage schon seit geraumer Zeit, ich dachte, es wert war etwas Feststellung, dass in vernachlässigt wurde der erste Beitrag. Hier ist mein Original-Code ist:

app.directive('countrymap', function() 
{ 
    return { 
     link: function(scope, element, attrs) { 
      scope.$watch("countryMap", function (newCountry, oldCountry) 
      { 
       setTimeout(function() 
       { 
        //function body here  
       }, 100); 
      }) 
     } 
    }; 
}]); 

Abgesehen von der eher philosophischen Design Frage, ob oder nicht, sollten Sie sogar $ rootScope verwenden überhaupt, gibt es eine offensichtlich falsche Sache mit meinem Code oben, dass ich links das Gefühl aus Mikes Lösung - die Referenz zu $ ​​rootScope. Wenn Sie wie ich sind und haben Ihre Richtlinie und Controller Dateien getrennt müssen Sie Ihren Code wie folgt ändern:

app.directive('countrymap', ['$rootScope', function($rootScope) 
{ 
    return { 
     link: function(scope, element, attrs) { 
      $rootScope.$watch("countryMap", function (newCountry, oldCountry) 
      { 
       setTimeout(function() 
       { 
        //function body here 
       }, 100); 
      }) 
     } 
    }; 
}]); 

Dennoch gibt noch eine weitere quälende Frage ist: Kann ich das gleiche Ziel ohne erreichen referenzieren $ rootScope in der Direktive? In der Tat kannst du. Sie müssen die Änderung an die $ rootScope-Eigenschaft übertragen, damit alle untergeordneten Bereiche die Änderung kennen und auf diese Änderung in der Anweisung achten können.

Controller:

$rootScope.countryMap = 'thiscountry_map'; 
$rootScope.$broadcast("countryMapChanged", $rootScope.countryMap); 

Richtlinie:

app.directive('countrymapalt', [function() 
{ 
    return { 
     link: function(scope, element, attrs) { 
      scope.$on("countryMapChanged", function(event, map) 
      { 
       setTimeout(function() 
       { 
        //function body here 
       }, 100); 
      }) 
     } 
    }; 
}]); 
1

Eine andere Möglichkeit ist es, einen Dienst zu erstellen und diesen Dienst Zugriff auf die $ rootScope und andere Funktionen werfen. Ich habe es so wegen meiner Umgebung ...

app.service('myService', function ($rootScope) 
{ 
    this.removeItem = function (el) 
    { 
     console.log('rootScope: ',$rootScope); 
     return true; 
    } 
}); 


app.directive('draggable', function($document,myService) 
{ 
    return function(scope, element, attr) 
    { 
     myService.removeItem({id:1}) 
    } 
}); 

Wenn Sie können, der beste Weg ist, Mike Lösung. Wenn nicht, versuche meine Lösung.

3

Manchmal muss ich $ Bereich verwenden $ root.

app.directive('setOrdinal', function() { 
    return { 
    link: function($scope, $element, $attr) { 

     var steps = $scope.$root.steps; 

     $scope.$watch(setOrdinal, function(value) { 
     if (value) 
     { 
      // steps code here 
     } 
     }); 
    } 
    }; 
}); 

app.controller('stepController', ['$scope', '$rootScope', 'GetSteps', function ($scope, $rootScope, GetSteps) { 
    var s = $scope; 
    var r = $rootScope; 

    s.initialize = function(id) 
    { 
    GetSteps.get({id: id}, function(resp){ 
     r.steps = resp.steps; 
    }); 
    }; 
}]); 
+0

gespeichert meine viel Zeit – EmptyData

Verwandte Themen