我有两个Angular指令,一个嵌套在另一个内,如下所示。
的HTML
<gss-response-group response-group-id="43" response-group-title="'Group Title'"> <gss-response-option option-id="5" option-text="'Very Often'" option-value="5.00" options-inline="true" type="'radio'"></gss-response-option> <gss-response-option option-id="6" option-text="'Often'" option-value="4.00" options-inline="true" type="'radio'"></gss-response-option> <gss-response-option option-id="7" option-text="'Sometimes'" option-value="3.00" options-inline="true" type="'radio'"></gss-response-option> <gss-response-option option-id="8" option-text="'Rarely'" option-value="2.00" options-inline="true" type="'radio'"></gss-response-option> <gss-response-option option-id="9" option-text="'Never'" option-value="1.00" options-inline="true" type="'radio'"></gss-response-option> </gss-response-group>
responseGroup.template.html
<div class="gss-response-group"> <label class="gss-response-group-title" ng-if="responseGroupTitle != null">{{responseGroupTitle}}</label> <placeholder></placeholder> </div>
responseOption.template.html
<div ng-class="{'gss-response-option': optionsInline}"> <input class="gss-{{type}}-option" id="{{id}}" name="{{groupName}}" type="{{type}}" value="{{optionValue}}" /> <label class="gss-option-text" for="{{id}}">{{optionText}}</label> <div class="gss-specifyanswer" ng-if="specify"> <label class="gss-specifyanswer" ng-if="specifyText != null">{{specifyText}}</label> <textarea class="gss-specifyanswer" maxlength="5000" disabled></textarea> </div> </div>
的JavaScript
'use strict'; angular.module( 'gssApp', [ 'gss.directives' ] ); angular.module( 'gssApp' ) .controller( 'gssAppController', [ '$scope', '$http', '$rootScope', function ( $scope, $http, $rootScope ) { }] ); var directiveModule = angular.module( 'gss.directives', [] ); directiveModule.directive( 'gssResponseGroup', function () { return { restrict: 'E', transclude: true, replace: true, scope: { responseGroupTitle: '=', responseGroupId: '=' }, templateUrl: 'responseGroup.template.html', link: function ( scope, element, attrs, ctrl, transclude ) { element.find( 'placeholder' ).replaceWith( transclude() ); }, controller: [ '$scope', '$rootScope', '$element', '$attrs', function ( $scope, $rootScope, $element, $attrs ) { }] }; } ); directiveModule.directive( 'gssResponseOption', function () { return { restrict: 'E', transclude: true, replace: true, scope: { responseGroupId: '=', optionId: '=', optionText: '=', optionValue: '=', type: '=', optionsInline: '=', specify: '=', specifyText: '=' }, templateUrl: 'responseOption.template.html', controller: [ '$scope', '$rootScope', '$element', '$attrs', function ( $scope, $rootScope, $element, $attrs ) { // HOW DO I GET THE PARENT DIRECTIVE'S SCOPE TO USE THE // responseGroupId FROM IT? $scope.id = 'rgID' + '_' + $scope.responseGroupId + '_' + $scope.optionId; $scope.groupName = 'rg' + '_' + $scope.responseGroupId; }] }; } );
我希望子指令可以访问父指令中的“ response-group-id”字段。我该怎么做呢?我能够通过让子指令要求父指令,然后在子指令的“ link”方法中获取它来获取值,但是那时将其应用于子模板已经为时已晚。
Plunker中的代码。
另外,如果有人能告诉我为什么我的Plunker项目中没有应用CSS,我将不胜感激(尽管这没什么大不了的)。
要在指令之间共享数据,建议在父指令的控制器上定义共享数据,并从子指令的链接功能访问它(请参见angular Developer Guide中的最后一个示例“创建可通信的指令” )。
因此,您的父指令的控制器如下所示:
function ( $scope, $rootScope, $element, $attrs ) { this.id = $scope.responseGroupId; }]
您的子指令如下所示:
directiveModule.directive( 'gssResponseOption', function () { return { ... require: '^gssResponseGroup', link: function(scope, element, attrs, gssResponseGroupCtrl) { scope.id = 'rgID' + '_' + gssResponseGroupCtrl.id + '_' + scope.optionId; scope.groupName = 'rg' + '_' + gssResponseGroupCtrl.id; }
请注意,如果对responseGroupId进行插值,则此解决方案将中断。如果该值更改,则它只会被id设置一次,因此不会反映在controller 属性中。代替该id属性,控制器必须定义一个getter方法,该方法始终检查的最新值$scope.responseGroupId。
responseGroupId
id
$scope.responseGroupId