我有指令,其中我提到了范围:
return {
restrict: 'AE',
transclude: true,
scope: {
model: '=',
menu: '='
},}
所以我的问题是模型和菜单变量除了我可以访问的所有变量之外?隔离范围是否继承父范围变量?
如果我不想使用隔离范围,那么可以在指令中设置这两个变量并从父范围继承所有变量的地方做什么?
谢谢。
答案 0 :(得分:1)
如果指令定义的scope
属性设置为{ /* object hash */ }
,则为指令创建隔离范围。如果将scope
属性设置为true
,则会生成一个从父作用域继承的新作用域。
请参阅此plunker,了解directive scope behaviour上的演示。
如果您不想隔离范围但想要将参数传递给指令,则可以使用attributes service的$ observe方法。
function linkingFn(scope, elm, attrs, ctrl) {
// get the attribute value
console.log(attrs.ngModel);
// change the attribute
attrs.$set('ngModel', 'new value');
// observe changes to interpolated attribute
attrs.$observe('ngModel', function(value) {
console.log('ngModel has changed value to ' + value);
});
}
使用$parse service可以创建没有隔离范围的双向绑定。
答案 1 :(得分:1)
如果我理解正确,你想要实现的是继承所有父东西的新范围。这很容易做到。
默认情况下,指令使用父作用域,但您可以执行两种不同的操作:
scope: {} // Isolated scope
或:
scope: true // new scope inheriting from parent
因此,对于后者,您将拥有所有父范围,但您可以在那里设置新内容,而父母将不知道。例如:
http://plnkr.co/edit/oL5ALPvkEzkiXSuOSNnE?p=preview
我希望这就是你要求的。
编辑:我编辑了plunker。具有继承自其他范围的新范围的想法是:
如果父有一个像name
这样的原语,孩子会继承它,但如果你做了类似的事情:
childScope.name = ".."
您没有修改父name
,您正在隐藏它,AKA正在创建一个隐藏父name
的新name
。这意味着父母永远不会知道孩子是否修改了name
。
foo
是在新的子范围中创建的,这意味着父母永远不会知道。
user
不是原始的,它是一个对象,当孩子修改它的name
时,它不会遮蔽整个user
,它只是修改它的值:
childScope.user.name = "Fox"
这是获取user
引用并修改其值,而不是修改整个user
,因此您不会将其隐藏。如果你这样做:
childScope.user = { name: 'Foo' };
然后你创建了一个完整的user
,AKA你正在创建一个新的引用,这样就会影响父user
,并且该对象的父子关系将结束。
这就是我们所说的dot rule
。
答案 2 :(得分:0)
当您设置这样的范围时,它是一个独立的范围,正如其名称所示,它不会从父范围继承任何属性。
但是,您可以在指令link
方法中直接定义范围上的变量,如下所示:
.directive('someDirective', function(){
return {
restrict: 'C',
link: function(scope, element, attrs){
scope.newVariable = "newVariable"
}
}
}
它为你的范围增加了newVariable。希望它有帮助〜
directive
的更多信息可在此处查看,http://docs.angularjs.org/guide/directive。有一个名为Creating a Directive that Manipulates the DOM