Мой взгляд прост:
<job-template ng-if="job"></job-template>
Моя директива:
.directive('jobTemplate', function(){
return {
restrict: 'AE',
replace: true,
link: function(scope,element, attrs) {
var JobStatus = scope.job.JobStatus;
var text = "<p>";
if(JobStatus === 'Created'){
text += "{{job.id}} was created."
}
else if(JobStatus === 'Processing'){
text += "{{job.id}} is currently processing."
}
text += "</p>";
console.log("text");
console.log(text);
return text;
}
};
})
Когда я запускаю свою страницу, мой элемент <job-template>
не заменяется ничем - хотя правильный text
загружается в консоль.
Что я тут сделал?
функция link
не предназначена для возврата HTML-кода, как вы думаете. В основном это должно быть, чтобы обеспечить контроль над угловым скомпилированным DOM, когда область действия связана с директивным элементом. В директиве вы можете указать html над параметром template/templateUrl
. Используйте ng-if
для наличия условного элемента.
директива
.directive('jobTemplate', function() {
return {
restrict: 'AE',
replace: true,
template: '<p>'+
'<span ng-if="job.JobStatus == \'Created\'">{{job.id}} was created.</span>'+
'<span ng-if="job.JobStatus == \'Processing\'">{{job.id}} is currently processing.</span>'+
'</p>',
link: function(scope, element, attrs) {}
};
})
Попробуйте этот код https://plnkr.co/edit/cpdAqWN0SeUx5Gy9CQkR?p=preview
app.directive('jobTemplate', function($compile){
return {
restrict: 'AE',
replace: true,
link: function(scope,element, attrs) {
console.log(element)
var JobStatus = scope.job.JobStatus;
var text = "<p>";
if(JobStatus === 'Created'){
text += "{{job.id}} was created."
}
else if(JobStatus === 'Processing'){
text += "{{job.id}} is currently processing."
}
text += "</p>";
element.html(text);
$compile(element.contents())(scope);
}
};
})
ng-if
, чтобы это не создавало проблем, если значениеjob
будет загружено ajax.