2014-03-12 121 views
0

我對同一個標記<settings><modal>有兩個指令。 settings提供了一個模板,而modal創建一個孤立的範圍:AngularJS:跨指令不共享的範圍

jsfiddle

var app = angular.module('app', []); 

app.directive('settings', function() { 
    return { 
     restrict: 'E', 

     template: '<div>SETTINGS</div>', 

     link: function (scope) { 
      console.log('settings', scope.$id); 
     } 
    }; 
}); 

app.directive('modal', function() { 
    return { 
     restrict: 'A', 

     scope: {}, 

     link: function (scope) { 
      console.log('modal', scope.$id); 
     } 
    }; 
}); 

然而,他們最終不會共享相同的範圍,如圖中的日誌:

<settings modal="settings"></settings> 

settings 002 
modal 003 

爲什麼就是它 ?

回答

1

直到版本1.2.0rc3,兄弟指令共享相同的隔離作用域(如果創建)。

從版本1.2.0開始,您無法(也不應該)從針對此隔離範圍編譯的內容之外訪問隔離範圍。你不應該因爲你在兩個指令之間創建了一個隱藏的關係。通過require屬性更好地使用指令的控制器要求,或者如果單例模式可以應用於您的用例,則通過注入的服務共享信息。

終於是深深地與此相關的其他問題有關Directives with Isolated scope versions conflict

1

scope: {}選項總是創建指令一個孤立的範圍,它並不關心其他指令

+0

OK,但我可以以某種方式獲取2個指令共享相同的(隔離)範圍是什麼?他們不能同時創建一個孤立的範圍。 –

+0

您可以將非隔離指令嵌入到單獨的指令中,或者創建一個獨立的包裝指令,然後保持它們都不是孤立的......我認爲將非隔離指令混合起來不是一個好主意作爲一個元素 – doodeec

+0

我試圖避免這種情況,可能是通過強制隔離指令來跨越非隔離指令,但我想我沒有選擇...... –

0
app.directive('modal', function() { 
    return { 
     restrict: 'A', 

     scope: false, 

     link: function (scope) { 
      console.log('modal', scope.$id); 
     } 
    }; 
}); 

範圍:false將不會創建一個新的隔離範圍。我想讓兩個指令在它們之間工作,使用指令中的一個控制器就可以在它們之間共享數據。