Angularjs 除了Transclude元素,我还可以将其范围传递给指令吗?
当我觉得自己已经对Angularjs 除了Transclude元素,我还可以将其范围传递给指令吗?,angularjs,angularjs-directive,angularjs-scope,angularjs-ng-transclude,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Ng Transclude,当我觉得自己已经对Transclude有了足够的了解时,我突然想到了这句话: Transclude allows us to pass in an entire template, including its scope, to a directive. Doing so gives us the opportunity to pass in arbitrary content and arbitrary scope to a directive. 这是否意味着,如果有一个作用域附加到Tra
Transclude
有了足够的了解时,我突然想到了这句话:
Transclude allows us to pass in an entire template, including its scope, to a directive.
Doing so gives us the opportunity to pass in arbitrary content and arbitrary scope to a directive.
这是否意味着,如果有一个作用域附加到Transclude元素,并且它可以传递给指令?如果这是真的,那么我就无法访问指令模板中的scope属性
让我后退几步,用代码解释我试图做什么:
我的指令是指令框
,指令定义对象(DDO)中定义了transclude:true
现在有一个子Div,它是要被转包的元素
<div ng-controller='TransCtrl'>Inside Transclude Scope : {{name}}</div>
这可能吗
这更像是父作用域试图访问子作用域属性,在JavaScript原型继承中允许这样做吗?或者还有什么我需要知道的吗
如果这是不可能的,第一句话是什么意思
Transclude allows us to pass in an entire template, including its scope, to a directive.
更新1:
我主要关心的是控制器应该保留Transclude元素,但我们应该能够将其(Transclude元素)作用域传递给指令,然后指令应该能够使用该作用域,即transtrl控制器的名称
<div ng-controller='TransCtrl'>Inside Transclude Scope : {{name}}</div>
内部转置作用域:{{name}
以上代码行应保持原样
我的问题可能完全错了,但如果可以做到,请告诉我。这是否回答了您的问题:
在其中,我在外部创建了一个新的控制器(有效地替换了指令内部的rootScope功能),并在控制器模板中设置了指令的控制器
尽管如此,您可以看到,将html及其作用域转换为具有自己作用域的指令也是可能的
html:
<div ng-app='myApp' ng-controller="OutsideScope">
<h1>{{externalWorld}}</h1>
<div directive-box directive-title='{{directiveWorld}}' name='name'>
<div>Inside Transclude Scope : {{name}}</div>
</div>
</div>
{{externalWorld}
内部转置作用域:{{name}
JS(包括更新1):
angular.module('myApp',[])
.directive('directiveBox',function(){
返回{
限制:“EA”,
范围:{
标题:“@directiveTitle”,
名称:'='
},
是的,
模板:'\
{{title}}\
指示元素\
外部转置作用域:{{name}\
\
'
}
})
.controller('TransCtrl',函数($scope){
$scope.name='Transclude World'
})
.controller('OutsideScope',函数($scope){
$scope.name='外部世界'
})
.run(函数($rootScope){
$rootScope.externalWorld='externalWorld',
$rootScope.directiveWorld='指令来了'
});
更新1:
我恢复了原始的范围声明,因为scope:false
是一个错误
如果我正确理解了您的注释,您希望将控制器保留在要转移的元素上,但仍在该元素中保留{{name}}
,忽略其直接控制器,并将其父(即指令的)范围用作控制器
我之所以将控制器放在template指令中,是因为这是限制指令作用域的唯一方法,而不是限制其转置元素。如果将控制器显式放置在元素上,则无论它是否包含在具有另一个作用域的指令中,其最近的作用域都将覆盖该指令上声明的任何作用域。换句话说,不管指令的作用域是什么,中的{{name}}
内部转移范围:{{name}
将始终是$scope.name
位于TransCtrl
中的任何内容这是否回答了您的问题:
在其中,我在外部创建了一个新的控制器(有效地替换了指令内部的rootScope功能),并在控制器模板中设置了指令的控制器
尽管如此,您可以看到,将html及其作用域转换为具有自己作用域的指令也是可能的
html:
<div ng-app='myApp' ng-controller="OutsideScope">
<h1>{{externalWorld}}</h1>
<div directive-box directive-title='{{directiveWorld}}' name='name'>
<div>Inside Transclude Scope : {{name}}</div>
</div>
</div>
{{externalWorld}
内部转置作用域:{{name}
JS(包括更新1):
angular.module('myApp',[])
.directive('directiveBox',function(){
返回{
限制:“EA”,
范围:{
标题:“@directiveTitle”,
名称:'='
},
是的,
模板:'\
{{title}}\
指示元素\
外部转置作用域:{{name}\
\
'
}
})
.controller('TransCtrl',函数($scope){
$scope.name='Transclude World'
})
.controller('OutsideScope',函数($scope){
$scope.name='外部世界'
})
.run(函数($rootScope){
$rootScope.externalWorld='externalWorld',
$rootScope.directiveWorld='指令来了'
});
更新1:
我恢复了原始的范围声明,因为scope:false
是一个错误
如果我正确理解了您的注释,您希望将控制器保留在要转移的元素上,但仍在该元素中保留{{name}}
,忽略其直接控制器,并将其父(即指令的)范围用作控制器
我之所以将控制器放在template指令中,是因为这是限制指令作用域的唯一方法,而不是限制其转置元素。如果将控制器显式放置在元素上,则无论它是否包含在具有另一个作用域的指令中,其最近的作用域都将覆盖该指令上声明的任何作用域。换句话说,不管指令的作用域是什么,中的{{name}}
内部转移范围:{{name}
意志
angular.module('myApp', [])
.directive('directiveBox', function() {
return {
restrict: 'EA',
scope: {
title: '@directiveTitle',
name: '='
},
transclude: true,
template: '<div ng-controller="TransCtrl">\
<h2 class="header">{{ title }}</h2>\
<div class="dirContent">Directive Element</div>\
<div>Outside Transclude Scope : {{name}}</div>\
<div class="content" ng-transclude></div>\
</div>'
}
})
.controller('TransCtrl', function($scope) {
$scope.name = 'Transclude World'
})
.controller('OutsideScope', function($scope) {
$scope.name = 'External World'
})
.run(function($rootScope) {
$rootScope.externalWorld = 'External World',
$rootScope.directiveWorld = 'Here comes directive'
});
controllerAs: "TransCtrl",
bindToController: true