我有两个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
。
问题内容: 这不是一件很难的事,但我无法弄清楚如何做到最好。 我有一个父指令,像这样: 和一个子指令: 如何从子指令轻松访问父指令的和属性?在我的链接函数中,我可以访问父级作用域-我应该用来观察这些属性吗? 放在一起,我想拥有的是: 这个想法是默认情况下显示一组字段。如果单击,它们将成为输入并可进行编辑。 问题答案: 从这篇SO帖子中汲取灵感,我在这个笨拙的人中有一个可行的解决方案。 我不得不改变
例如,Angular 2内置的属性指令ngClass和ngStyle,可以在任何组件或元素上工作。
我们可以直接将一个字符串绑定到属性。这就像添加一个html属性一样。 View Example 在这里,由于我们使用表达式绑定到指令,我们需要在方括号中包装指令名称。当你想有一个函数放在适用的类名列表时,传入数组是很有用的。 View Example 在这里我们可以看到,由于对象的 和属性是true,这些classes将会生效,但由于是false,它不会生效。
selector: 'app-style-example', template: ` <p style="padding: 1rem" [ngStyle]="alertStyles"> ` }) export class StyleExampleComponent { borderStyle = '1px solid black'; 'color': 're
View Example 我们有礼貌,所以不是仅仅将用户发送到新页面,而是通过创建属性指令并将其附加到按钮,来询问他们是否确定跳转。 selector: `[appConfirm]` }) export class ConfirmDirective { @HostListener('click', ['$event']) confirmFirst(event: Event) {
装饰器允许我们在指令的host元素上编程设置属性值。 它类似于模板中定义的属性绑定,除了它专门定位到host元素。 对每个变化检测周期检查绑定,因此如果需要,它可以动态地改变。 注意,对于的两个用例,我们传递一个字符串值到我们想要改变的属性。如果我们不向装饰器提供字符串,那么将使用类成员的名称。