我正在生成一份包含问题集的报告。
app.controller('reportCtrl', ['$scope','$stateParams', function ($scope, $stateParams) {
$scope.questions: [
{ questionkey: 1, questiontext: 'Type', questiontype: 1 , questionmodel:'accsType' },
{ questionkey: 2, questiontext: 'Reported By', questiontype: 1, questionmodel: 'accsReportedBy' },
{ questionkey: 3, questiontext: 'Time and Date', questiontype: 6, questionmodel: 'accsCurrentDate' },
{ questionkey: 4, questiontext: 'Address', questiontype: 2, questionmodel: 'accsAddress' },
{ questionkey: 5, questiontext: 'Coordinates', questiontype: 6, questionmodel: 'accsCoordinates' },
{ questionkey: 6, questiontext: 'Blank', questiontype: 1, questionmodel: 'accsBlank1' },
{ questionkey: 7, questiontext: 'Blank', questiontype: 1, questionmodel: 'accsBlank2' },
{ questionkey: 8, questiontext: 'Blank', questiontype: 1, questionmodel: 'accsBlank3' },
{ questionkey: 9, questiontext: 'Blank', questiontype: 1, questionmodel: 'accsBlank4' },
{ questionkey: 10, questiontext: 'Details of Survey', questiontype: 2, questionmodel: 'accsDetailsSurvey' },
{ questionkey: 11, questiontext: 'Photos', questiontype: 5, questionmodel: 'accsPhotos' }
];
}]);
并且我已经创建了一个自定义指令来根据问题类型绘制问题例如,问题类型1是文本框类型2是textarea
<question contents="questions"></question>
app.directive('question', function ($compile) {
return {
transclude: true,
restrict: 'E',
scope: {
contents: '='
},
link: function (scope, element, attrs) {
angular.forEach(scope.contents, function (k, v) {
var ele;
switch (parseInt(k.question.questiontype)) {
case 1:
ele = $compile("<accstextbox data='k.question'></accstextbox>")(scope);
break;
case 2:
ele = $compile("<accstextarea data='k.question'></accstextarea>")(scope);
break;
}
element.append(ele);
});
}
};
});
我为每个问题类型
创建了一个指令app.directive('accstextbox', [function () {
return {
restrict: 'E',
templateUrl: 'app/directives/questions/textbox.html',
link: function (scope, element, attrs) {
console.log(scope.data); // undefined
},
scope:{
data: '='
}
};
}]);
app.directive('accstextarea', [function () {
return {
restrict: 'E',
templateUrl: 'app/directives/questions/textarea.html',
link: function (scope, element, attrs) {
console.log(scope.data); // undefined
},
scope: {
data: '='
}
};
}]);
当我动态添加这些指令时,我通过属性传递数据对象。在子指令范围内未定义该数据对象。我第一次在我的项目中使用angularjs。
答案 0 :(得分:1)
由于k
是本地变量且$compiler
服务无法访问,因此您的解决方案无效。
解决方法是让您的指令使用ngRepeat
和ngIf
通过模板生成最终布局:
app.directive('question', function ($compile) {
return {
transclude: true,
restrict: 'E',
templateUrl: 'app/directives/questions.html',
scope: {
contents: '='
}
};
});
app/directives/questions.html
:
<div ng-repeat="question in contents">
<accstextbox ng-if="question.questiontype == 1" data="question"></accstextbox>
<accstextarea ng-if="question.questiontype == 2" data="question"></accstextarea>
</div>
由于这是一个非常小的模板,您可以将其添加到指令的template
配置参数,而不是通过templateUrl
从服务器加载。
希望这会对你有帮助!
答案 1 :(得分:1)
正如Vinicius指出的那样,您在文本字符串中使用k
循环内的forEach
对象,因此有角度无法解析k.questions
的含义。
我提出了一个类似的解决方案,在你的question
指令中重复ng-repeat中的问题:
<div>
<div ng-repeat="q in contents">
<div ng-switch="q.questiontype">
<div ng-switch-when="1">
<accstextbox> one: {{q.questiontext}}</accstextbox>
</div>
<div ng-switch-when="2">
<accstextarea> two : {{q.questiontext}}</accstextarea>
</div>
</div>
</div>
</div>
另一种选择是将选择模板类型的逻辑移到子指令中。如果您的唯一更改是输入类型,并且逻辑上没有太大差异,我会更喜欢这个选项,因此您可以避免重复代码,即子指令模板将包含输入选择逻辑:
<div>
<div ng-if="question.questiontype === 1">
<input type="text"/>
</div>
<div ng-if="question.questiontype === 2">
<textarea name="" id="" cols="30" rows="10"></textarea>
</div>
</div>