我正在玩指令的bindToController
選項。我偶然發現了使用子範圍的行爲與孤立範圍之間的看似奇怪的區別。當我使用隔離的作用域時,將爲該指令創建一個新的作用域,但對綁定的控制器屬性的更改將轉發到父作用域。然而,當我使用一個子範圍,而我的例子中斷。 (使用bindToController
使用童工範圍應根據http://blog.thoughtram.io/angularjs/2015/01/02/exploring-angular-1.3-bindToController.html#improvements-in-14被允許)兒童範圍內的行爲bindToController與隔離範圍
代碼:
{
restrict: 'E',
scope: {},
controller: 'FooDirCtrl',
controllerAs: 'vm',
bindToController: {
name: '='
},
template: '<div><input ng-model="vm.name"></div>'
};
工作演示https://jsfiddle.net/tthtznn2/
使用兒童範圍的版本:
{
restrict: 'E',
scope: true,
controller: 'FooDirCtrl',
controllerAs: 'vm',
bindToController: {
name: '='
},
template: '<div><input ng-model="vm.name"></div>'
};
演示: http://jsfiddle.net/ydLd1e00/
對名稱的更改被轉發到子作用域,但不轉發到父作用域。這與綁定到一個孤立的範圍相反。爲什麼是這樣?
因爲vm.name是字符串和JavaScript傳值?可能會再創建一個像vm.data.name這樣的嵌套對象並綁定數據。 – YOU
實際上,在後一種情況下綁定到一個對象(請參閱:http://jsfiddle.net/sbvm1nd4/)。儘管如此,我仍然不明白孤立子域與子域之間爲什麼會有所不同,但我希望孤立域也會遇到同樣的問題。 –
其原型繼承的JavaScript性質 - https://github.com/angular/angular.js/wiki/Understanding-Scopes,我個人認爲角度可以改變這種行爲是一致的,因爲所有的表達式都是通過角度的AST來分析的,但是可能是他們選擇遵循javascript的本質。 – YOU