AngularJS访问子指令中的隔离作用域

AngularJS访问子指令中的隔离作用域,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,以下是我的HTML部分: <div data-my-question="" data-question="Question text?"> <div data-yes=""> YES! </div> <div data-no=""> NO! </div> </div> 对 不 以下是我的角度指示: angular.module('myModule').di

以下是我的HTML部分:

<div data-my-question="" data-question="Question text?">
    <div data-yes="">
        YES!
    </div>
    <div data-no="">
        NO!
    </div>
</div>

对
不
以下是我的角度指示:

angular.module('myModule').directive('myQuestion', [
    function () {
        return {
            restrict: 'A',
            replace: true,
            scope: {
                question: '@'
            },
            transclude: true,
            controller: function($scope){
                $scope.answered = false;
                $scope.yesActive = false;

                $scope.activateYes = function (yesActive) {
                    $scope.answered = true;
                    $scope.yesActive = yesActive;
                };
            },
            template:  '<div>' +
                '<div class="question-box" ng-class="{answered: answered}">' +
                '<div class="question">' +
                '{{question}}' +
                '</div>' +
                '<div class="buttons">' +
                '<a href="" class="btn btn-small" ng-click="activateYes(true)">Yes</a>' +
                '<a href="" class="btn btn-small" ng-click="activateYes(false)">No</a>' +
                '</div>' +
                '</div>' +
                '<div ng-transclude></div>' +
                '</div>'
            };
    }
])
.directive('yes', [
    function () {
        return {
            restrict: 'A',
            replace: true,
            transclude: true,
            template:   '<p ng-show="answered && yesActive" ng-transclude></p>'
        };
    }
])
.directive('no', [
    function () {
        return {
            restrict: 'A',
            replace: true,
            transclude: true,
            template:   '<p ng-show="answered && !yesActive" ng-transclude></p>'
        };
    }
]);
angular.module('myModule')。指令('myQuestion'[
函数(){
返回{
限制:“A”,
替换:正确,
范围:{
问题:“@”
},
是的,
控制器:功能($scope){
$scope.responsed=false;
$scope.yesActive=false;
$scope.activateEyes=函数(yesActive){
$scope.answered=true;
$scope.yesActive=yesActive;
};
},
模板:“”+
'' +
'' +
“{{问题}}”+
'' +
'' +
'' +
'' +
'' +
'' +
'' +
''
};
}
])
.指令('是'[
函数(){
返回{
限制:“A”,
替换:正确,
是的,
模板:'

' }; } ]) .指令('否'[ 函数(){ 返回{ 限制:“A”, 替换:正确, 是的, 模板:'

' }; } ]);
问题是,子指令(“yes”、“no”)无法访问父指令中的“answered”和“yesActive”变量,父指令具有独立的作用域


如何实现子指令对父指令的值更改作出反应?

被转移的元素将无法访问该指令的隔离范围

Angular就是这样工作的,一个独立的作用域(myQuestion)将不会从任何父对象继承,而被转移的元素(Yes/No)将成为myQuestion作用域的同级

被转移的元素将是定义它们的原始范围的子元素,这样它们仍然能够绑定,而不是被隔离。

如果选中此选项,在控制台中,您将看到Yes/No作用域可以访问$rootScope(定义pizza的地方),而myQuestion的独立作用域则不能

你可以得到更多关于这个的信息

解决方案:


我喜欢简单的代码,因此如果可能的话,我会在问题模板中移动Yes/No元素,但您也可以

谢谢你的解释。我解决了从问题到是/否的广播问题