2012-09-28 5 views
19

Sagen wir, ich habe folgendes als Teil meiner directive Definition:Gibt es eine Möglichkeit, einen Standardwert für einen isolierten Bereichsalias anzugeben?

scope: { 
    prop1: '@' 
} 

Gibt es eine Möglichkeit für PROP1 einen Standardwert zu erhalten, wenn die Richtlinie Attribut keinen PROP1 haben? Klar, ich kann prüfen, ob es selbst definiert ist und es einstellen, aber the property isn't always set when you would expect. Ich frage mich nur, ob es eine Syntax gibt, die ich in der Dokumentation verpasst habe, oder ob es eine gute Standardmethode dafür gibt. Vielen Dank.

Antwort

19

Es hängt davon ab, welchen Standardwert Sie zuweisen möchten. Wenn Sie auf einen Namen in der übergeordneten Bereich auf Standard möchten, Setzen eines Standard-Attributwert in der compile Funktion der Richtlinie funktioniert:

 
    compile: function(element, attrs) { 
    if (attrs.person == undefined) { 
     attrs.$set("person", "person"); 
    } 
    ... 

Wenn Sie die Richtlinie soll den Standardwert zur Verfügung zu stellen, wird es ein wenig tricker als Mit Angular können Sie dem Alias ​​im Isolationsbereich nicht zuweisen (Sie erhalten eine Ausnahme vom Typ "Nicht zuweisbarer Modellausdruck" vom Beobachter, der versucht, die Zuweisung an den isolierten übergeordneten Bereich weiterzugeben). Sie können dies jedoch verhindern, indem Sie das Attribut als optional markieren (was bedeutet, dass Angular den Listener nicht registriert, wenn die Eigenschaft weggelassen wird).

 
    scope: { 
    person: "=?" 
    }, 
    link: function(scope, element, attrs) { 
    if (scope.person == undefined) { 
     scope.person = "Bob"; 
    } 
    ... 
    } 
+1

Ich habe die '?' -Notation in der scope -Eigenschaft nie zuvor gesehen. Gibt es einen Ort, der dokumentiert ist? Oder eine Geige, die das funktioniert zeigt? – dnc253

+0

https://github.com/angular/angular.js/commit/ac899d0da59157fa1c6429510791b6c3103d9401 – epeleg

+1

Zwei Dinge: 1) benutze 'angular.isUndefined (...)' und 2) es ist hier dokumentiert: https: //docs.angularjs. org/api/ng/service/$ kompilieren # directive-definition-object – icfantv

-3
scope['prop1'] = scope['prop1'] || '@' 
+0

Ich sehe, dass die Arbeit in einem allgemeinen JavaScript Sinn, aber diese Frage ist für, wenn Sie eine Richtlinie mit AngularJS spezifisch definieren. Ich sehe nicht, wie ich dieses Konzept dort anwenden könnte. – dnc253

+0

angular wird einen Fehler ausgeben, wenn Sie versuchen, diese Syntax mit dem optionalen Flag '?' Auszuführen. Folgen Sie der obigen Lösung von @niall. – icfantv

Verwandte Themen