У меня есть директива, которая обрабатывает загрузку файлов. Директива использует «контроллер» и «controllerAs» для динамических контроллеров, а в функции «link» она вызывает обратные вызовы, которые запускаются в соответствующем динамическом контроллере.«это» не определено в обратном вызове из директивы
проблема, когда обратный вызов выполняется в контроллере, «это» не определено. Как установить imageUrl в контроллере?
Директива:
.directive('attachable', function(FileUploader) {
return {
restrict : 'E',
transclude : true,
templateUrl : 'template.html',
scope : {},
controller : '@',
controllerAs: 'uploadCtrl',
name : 'controller',
link: function(scope, element, attrs) {
var controller = scope.uploadCtrl;
var uploader = scope.uploader = new FileUploader({
url: controller.uploadUrl
});
// callbacks
uploader.onAfterAddingFile = function(item) {
controller.onAfterAddSuccess();
};
}
};
});
Контроллер:
angular.module('core').controller('controller', ['$window', function($window){
this.onAfterAddSuccess = function(item){
if ($window.FileReader) {
var fileReader = new FileReader();
fileReader.readAsDataURL(item._file);
fileReader.onload = function (fileReaderEvent) {
$timeout(function() {
this.imageURL = fileReaderEvent.target.result; // <- this is undefined
}, 0);
};
}
};
}]);
HTML:
<attachable controller="controller" ></attachable>
РЕДАКТИРОВАТЬ:
ste2425 's ответ разрешает ошибку' undefined ', но почему imageURL's новое значение недоступно вне моего контроллера, т. е. вид?
обновленный контроллер:
...
fileReader.onload = function (fileReaderEvent) {
this.imageURL = '';
$timeout(function(){
this.imageURL = fileReaderEvent.target.result;
}.bind(this), 1);
};
...
HTML:
imageURL: {{ imageURL }} <- this is still ''
<attachable controller="controller" ></attachable>
Ваше предложение разрешает 'undefined', но проверьте мой отредактированный вопрос pls - новое значение imageURL не отражает в моем представлении. Какие-либо предложения? – ceebreenk
, потому что вы используете 'this' и' controllerAs', вам не нужно ссылаться на него в своем представлении с помощью 'uploadCtrl.imageURL'? Я никогда не делал этого в директивах, но это то, как это работает с 'ng-controller'. Если вы хотите использовать синтаксис, который вы получили в своем представлении, сбрасывайте контроллер и заменяете 'this' своей' $ scope'. – ste2425