我正在尝试通过属性加载条件模板URL,我的指令如下。
该指令处于ng-repeate状态,当box.key =='experience'时,表达式返回education-form.php而不是experience-form.php。
<div multiple-form
directive-data='directiveData'
template-url="box.key == 'experiences'? 'experiences-form.php':'education-form.php'"
item="item"
forms="forms"
form-name="{{box.key}}{{item._id}}"
onsave="updateMultipleUser(box.key, item._id, $data)"
onreset="formAction($formName, 'reset')"
cancel="formAction($formName, 'cancel')"
>
</div>
指令DDO
{
restrict: 'A',
replace: true,
scope: {
directiveData: '=',
onsave: '&',
onreset: '&',
cancel: '&',
formName: '@',
forms: '=',
item: '='
},
controller: controller,
templateUrl: function(tElement, tAttrs) {
return $rootScope.$eval(tAttrs.templateUrl);
}
}
尝试使用链接功能
<div multiple-form
directive-data='directiveData'
template-map="{
experiences:'experiences-form.php',
courses:'education-form.php'
}"
box="box"
item="item"
forms="forms"
form-name="{{box.key}}{{item._id}}"
onsave="updateMultipleUser(box.key, item._id, $data)"
onreset="formAction($formName, 'reset')"
cancel="formAction($formName, 'cancel')"
>
</div>
controller: controller,
link: function(scope, element, attrs) {
// shows correct template url ... now what?
console.log(scope.templateMap[scope.box.key]);
},
templateUrl: function(tElement, tAttrs) {
return 'experiences-form.php';
}
答案 0 :(得分:1)
<强>标记强>
<div multiple-form
directive-data='directiveData'
ng-attr-template-url="{{box.key == 'experiences'? 'experiences-form.php':'education-form.php'}}"
item="item"
forms="forms"
form-name="{{box.key}}{{item._id}}"
onsave="updateMultipleUser(box.key, item._id, $data)"
onreset="formAction($formName, 'reset')"
cancel="formAction($formName, 'cancel')"
>
</div>
然后你的templateUrl函数将是
templateUrl: function(tElement, tAttrs) {
$timeout(function(){ //wait until the ng-attr evaluates a value.
return tAttrs.templateUrl;
})
}
不确定它是否有效。
<强>更新强>
另一种明显的方法是从链接功能加载模板并从那里附加它自己而不是通过templateUrl
<强> HTML 强>
<div multiple-form
directive-data='directiveData'
template-path="{{box.key == 'experiences'? 'experiences-form.php':'education-form.php'}}"
item="item"
forms="forms"
form-name="{{box.key}}{{item._id}}"
onsave="updateMultipleUser(box.key, item._id, $data)"
onreset="formAction($formName, 'reset')"
cancel="formAction($formName, 'cancel')">
</div>
<强>指令强>
{
restrict: 'A',
replace: true,
scope: {
directiveData: '=',
onsave: '&',
onreset: '&',
cancel: '&',
formName: '@',
forms: '=',
item: '=',
templatePath: '@'
},
controller: controller,
link: function(scope, element, attrs){
//here you will have template path in your scope.templatePath variable
//you can load template using it.
var template = getTemplate(); //this can be done by below mentioned way
element.append($compile(template)(scope));//addding compiled element
}
}
在您的链接功能中,您可以通过按需加载模板来附加指令模板,有几种方法可以从指令加载模板
使用$templateCache
时,您需要在运行阶段将该模板放在角度$templateCache
中,
app.run(function($templateCache){
$templateCache.put('myTemplate.html', '<div>myTemplate</div>')
})
执行此操作后,您只需添加$templateCache.get('myTemplate.html')
在$templateCache
中添加模板的另一种方法是将script
标记用于type="text/ng-template"
<script type="text/ng-template" id="myTemplate.html">
<div>myTemplate</div>
</script>
您可以使用$http.get('myTemplate.html')
成功获取模板,您将获得的数据只是文件的html内容。您可以编译并将该html附加到指令元素。
您可以在此处使用ng-include指令。您需要创建一个虚拟div,它将具有所需template-path
的ng-include指令,如<div ng-include="templatePath"></div>
,它将在该div中加载模板。如果您不想使用div,则可以使用<ng-include src="templatePath"></ng-include>
。但这不是一个更好的代码编写方式。因为它确实创建了像ng-repeat那样的子范围。