使用嵌入隐藏内部元素的父范围的指令范围
Directive scope using transclusion hiding parent scope of inner elements
我正在尝试实现一个指令,该指令将使用ng-show
和$timeout
延迟容器的出现。
这是我的指令的样子:
angular.module('myApp')
.directive('delay', function($timeout) {
return {
template: '<div ng-show="showIt" ng-transclude></div>',
replace: false,
transclude: true,
scope:true,
restrict: 'A',
link: function postLink(scope, element, attrs) {
$timeout(function() {
scope.showIt = true;
}, attrs.delay);
}
};
});
然后,我会像这样在我的视图中使用它
<div delay="1000">
<intput type="text" ng-model="myText"/>
</div>
到目前为止,延迟有效。是的,我很自豪。但是,无法再从控制器访问myText
,因为它对父作用域不可见。我尝试将范围更改为以下内容:
scope: {
myText: '='
}
建立双向数据绑定...没有任何成功。
使用指令实现我尝试实现的目标的最简单方法是什么?多谢!
编辑:黄金法则
非常感谢格雷格尔的回答!
最好的方法是简单地将我的ng模型包装在一个对象中,以使用点符号来避免将ng模型绑定到子范围。子作用域使用原型继承来查找其值,因此在子作用域中设置该值后,它将不再查找父作用域。
解决这个问题的最好方法是记住我所说的"AngularJS黄金法则":
始终在 ng 模型表达式中使用点/句点 (.(。
这样,您将属性写入正确作用域上的正确对象。
但是,如果你真的想让它工作,你可以做一个指令,利用 link 函数的 transclude
参数对正确的范围进行手动嵌入。
sample.directive('delay', function($timeout) {
return {
template: '<div ng-show="showIt"></div>',
replace: false,
transclude: true,
scope: {},
restrict: 'A',
link: function postLink(scope, element, attrs, nullCtrl, transclude) {
var transcludeScope = scope.$parent;
transclude(transcludeScope, function(clone) {
element.find('div[ng-show]').append(clone);
});
$timeout(function() {
scope.showIt = true;
}, attrs.delay);
}
};
});
这会将<div ng-show="showIt">
的内容范围设置为 delay
指令所在的元素的范围。它还具有具有隔离范围的优点,因此您可以在任何位置使用多个实例。
在 Plunkr 中查看它的实际效果
尝试{scope: false}
.您正在使用 delay
指令创建自己的作用域。
或
link: function(scope, element) {
var showing = true;
$timeout(function() {
if (showing) {
element.hide();
} else {
element.show();
}
showing = !showing;
}, delay)
}
相关文章:
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- AngularJS:带有HTML和angular表达式的指令;编译”;具有外部范围的内容
- AngularJS指令范围约束问题重复出现
- 在 Angular 指令中,如何进行回调,其中函数名称位于父范围的变量中
- 对于使用传递的数据计算的局部范围变量,角度绑定在自定义指令中不起作用
- AngularJS:从控制器访问特定的指令范围
- AngularJS:从指令设置范围变量
- AngularJS在指令模板中修改范围
- 基于范围数据更改指令模板中的元素
- 如果指令包含在另一个指令中,我如何在隔离范围内添加双向数据绑定属性
- 日期-时间范围指令字段未显示任何值
- 从父控制器传递工厂数据以隔离范围指令
- 从子元素访问范围指令
- AngularJS在父级和子级范围指令之间共享数据
- 隔离范围指令会导致业力错误
- 范围$指令中的watch't在AJAX请求后被调用
- 如何在AngularJS中对隔离范围指令进行单元测试
- AngularJS隔离范围指令
- 从隔离范围指令中的更改更改控制器变量值
- 美元的范围.指令中的项未定义