为什么角度绑定在传入时会中断指令之间的绑定
Why does angular binding breaks between directives when transcluded?
我有以下场景
我将一个页面与一个控制器和几个指令结合在一起,其中一个指令打开了transclude开关(这似乎导致了问题)。
当我点击"changeMe()"时,作用域的值将更改为erez
。
当我单击"关闭"时,我们将null
分配给指令范围内的属性。我用null以外的值验证了相同的场景。。。
当我再次点击"changeMe()"时。。。什么都没发生!!为什么?我该如何修复它?
HTML模板
<div my-layout="">
<button ng-click="changeName()">Change me!</button>
<div>
{{name}} - This is my name directive
<div my-name name="name"></div>
</div>
</div>
Javascript代码
angular.module('guy', []);
angular.module('guy').controller('GuyCtrl', function($scope){
$scope.name = 'guy';
$scope.changeName = function(){
$scope.name = 'erez';
}
});
angular.module('guy').directive('myName',function ($log) {
return {
template: '<div> my name is: {{name}} <button ng-click="close()">Close</button></div>',
restrict: 'EA',
scope: {
name : '=name'
},
link: function postLink($scope, element) {
$scope.close = function(){
$scope.name = null;
}
}
}
}
);
angular.module('guy').directive('myLayout',function ($log) {
return {
template: '<div>This is the grand layout<div ng-transclude></div></div>',
restrict: 'EA',
transclude:true,
link: function postLink($scope, element) {
$log.info('linking layout');
}
}
}
);
您可以使用这个plunkr来运行它
您是原型作用域继承的受害者。简言之:永远不要使用一级(即$scope.xxx
)属性进行双向绑定。相反,使用包装器对象(data
或model
是方便的名称)作为:$scope.data = { name: 'guy' }
。
结果是,通过原型作用域继承,myLayout
指令在控制器的作用域下创建了一个NEW作用域。因此,每当它从不存在的第一级属性(即$scope.name
)读取时,它都会从父级读取。当它写东西的时候,它自己写。并且进一步读取访问本身对一级继承属性的更改永远不会传播到原型父级
用这个原理检验一个分叉的plunk;并确保您了解Javascript的原型继承,它应用于Angular的作用域。
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- 无法通过数组映射绑定
- NG-重复中断指令模型绑定
- AngularJS数据绑定中断ngRepeat+奇怪行为
- 当通过Ajax成功回调更新可观察数组时,启用绑定中断
- 如何在Angular中首次渲染后中断数据绑定
- 绑定存储中断组合框
- 使用 jquery ui 对话框时,Ember 中的双向绑定中断
- 更改值后,文本区域上的ng绑定中断
- 为什么角度绑定在传入时会中断指令之间的绑定
- 使用具有全局值的Javascript replace()时,ng绑定html中断
- 如果以异步方式加载绑定的资源,则函数中的$watch/$timeout包装会中断双向绑定
- KnockOut绑定在移动DOM元素后中断
- KnockoutJS +聚合物:绑定中断(Chrome之外)
- Angular ng-pattern会导致绑定中断
- 在knockout.js中为applyBindings实例化视图模型时,绑定会中断
- 在SVG命名空间中创建元素时绑定中断[使用JSFiddle]
- 销毁手风琴绑定中断
- Angular-ngResource中断数据绑定
- Ember.js:原生输入类型="number"约束值时绑定中断