2012-09-28 60 views
19

說我有以下爲我directive定義的一部分:有沒有辦法爲隔離範圍別名提供默認值?

scope: { 
    prop1: '@' 
} 

有沒有辦法爲PROP1得到一個默認值,如果指令沒有爲prop1屬性?當然,我可以檢查它是否是自己定義並設置的,但是the property isn't always set when you would expect。我只是想知道是否有任何我在文檔中遺漏的語法,或者是否有一個很好的標準方法來做到這一點。謝謝。

回答

19

這取決於您要分配的默認值。如果你想默認父範圍的名稱,設置在該指令的compile功能的默認屬性值將工作:

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

如果你想指令提供的默認值,就有點tricker作爲Angular不會讓您分配到隔離範圍中的別名(您將從試圖將分配傳播到獨立父級作用域的觀察者處得到「不可分配模型表達式」異常)。但是,您可以通過將該屬性標記爲可選項來避免這種情況(這意味着當屬性被忽略時,Angular不會註冊監聽器)。

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

我從來沒有在範圍屬性中看到'?'記號。有沒有文件記錄的地方?或者小提琴表明工作? – dnc253

+0

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

+1

有兩件事:1)使用'angular.isUndefined(...)'和2)在這裏記錄:https://docs.angularjs。 org/api/ng/service/$ compile#directive-definition-object – icfantv

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

我看到工作在一般的javascript意義上,但這個問題是專門用AngularJS定義指令時的。我不明白我在那裏如何使用這個相同的概念。 – dnc253

+0

如果您嘗試使用'?'可選標誌來執行此語法,則會引發錯誤。按照上面的解決方案@niall。 – icfantv

相關問題