Скажем, у меня есть директива, которая принимает атрибут с именем "url", который может состоять из выражений и статических текстов, а оцененный результат "url" будет использоваться в качестве URL-адреса ng-include в шаблоне директивы. Как проверить, изнутри директивы, что атрибут полностью оценивается (т.е. все выраженные выражения), прежде чем я попытаюсь использовать его, чтобы каждый раз я не получал ошибку 404?
app.controller('MyCtrl', function($scope, $timeout) {
$timeout(function(){
$scope.form = { id: 'test' };
}, 1000)
})
.directive('ngMyForm', function() {
return {
template: '<div ng-include="formUrl"></div>',
link: function(scope, element, attrs) {
attrs.$observe('url', function(value) {
// how do I make sure that value expression is fully "resolved" before using it?
scope.formUrl = value;
});
}
};
});
Здесь HTML:
<body ng-controller="MyCtrl">
<div ng-my-form="{{form.id}}_sometext" url="/form/{{form.id}}_sometext"></div>
</body>
Я создал плунгу здесь: http://plnkr.co/edit/MDhUpT?p=preview
Атрибут всегда "полностью оценен". Это просто, что содержащиеся в нем выражения оцениваются пустой строкой и позже вычисляются на что-то еще. Директива не может угадать, когда выражение должно быть правильным и когда оно должно быть неверным. Пользователь директивы должен просто не использовать его, пока URL неизвестен. Например:
<div ng-if="form.id" ng-my-form url="/form/{{form.id}}_sometext"></div>