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