2014-09-12 17 views
35

是否可以檢查給定屬性是否存在於指令中,理想情況下是使用隔離範圍還是最壞情況下屬性對象。檢查Angular Directive中是否存在屬性

有一個看起來像這樣的指令<project status></project>,我想有條件地呈現一個狀態圖標,但只有當status屬性存在。

return { 
    restrict: 'AE', 
    scope: { 
    status: '@' 
    }, 
    link: function(scope, element, attrs) { 
    scope.status === 'undefined' 
    } 
} 

理想情況下,它將直接綁定到範圍,以便它可以在模板中使用。但是,綁定變量的值是undefined&只讀=雙向綁定。

我知道通過添加<project status='true'></project>可以解決問題,但對於經常使用的指令,我寧願不必。 (XHTML有效性,不是問題)。

+0

我知道你提到它,但只是想知道 - di d你在attrs中嘗試類似「狀態」的東西,看看那個評價是什麼? – Ian 2014-09-12 15:31:31

+0

不是「@」是傳遞給指令的單向文本綁定嗎?因此scope.status應該是文本閱讀'true',只要您將一個變量傳入指令 SoluableNonagon 2014-09-12 15:39:49

+0

當您將範圍指定爲上述對象時,該指令會創建一個新的隔離範圍,該範圍不會繼承屬性父範圍。而是使用scope:true來創建一個新的作用域(可以訪問父作用域屬性),或者使用scope:false來使指令使用父作用域。你在問什麼?我不太明白你的問題...... – 2014-09-12 15:44:26

回答

60

做到這一點的方法是檢查屬性的鏈接功能的ATTRS參數中存在,並將其分配給指令隔離範圍內的變量。

scope:{}, 
link: function(scope, element, attrs){ 
    scope.status = 'status' in attrs; 
}, 

這應該不需要在鏈接函數中使用if語句。

17

做你想要的東西的方式是通過在鏈接功能看屬性對象:

link: 
    function(scope, element, attrs) { 
    if("status" in attrs) 
     //do something 
    } 
1

由於attrs的值是javascript的類型object。要檢查屬性的存在,我們也可以使用hasOwnProperty()方法代替in關鍵字。

因此,它可能是:

link: function(scope, element, attrs) { 
    var is_key_exist = attrs.hasOwnProperty('status');//Will return true if exist 
} 

可以進一步區別in關鍵字和hasOwnProperty()方法之間的這種link

2

要使用角度1.5+組件時檢查屬性你可以使用閱讀$ postLink生命週期鉤子和$元素服務是這樣的:

constructor(private $element) {} 

$postLink() { 
    if(!this.$element.attr('attr-name')){ 
    // do something 
    } 
}