ファイルのアップロード用のディレクティブをAngularで作成しました。成功コンポーネントのコールバックを親コンポーネントからディレクティブに渡したいと思いますが、途中で失われてしまう関数内にはthis
が参照されています。元の 'this'参照を保持したまま、ディレクティブ属性を使って関数を渡す方法
この場合、.bind(this)
はどうすればよいですか?
親コンポーネントテンプレート:
<input
type="file"
name="xml-file"
class="hidden"
id="xml-file-input"
accept="text/xml"
file-upload
file-upload-accept="text/xml"
file-upload-then="$ctrl.fileUploadOnSuccess"
file-upload-url="/versementPublique/{{ $ctrl.noDemande }}/dossiers">
ファイルアップロードディレクティブ:
function FileUploadDirective(dialogBoxService, glossaryFilter, $parse, fileUploadService) {
return {
restrict: 'A',
link(scope, elem, attrs) {
const name = attrs.name;
const url = attrs.fileUploadUrl;
const type = attrs.fileUploadAccept;
const successCallback = $parse(attrs.fileUploadThen)(scope);
elem.on('change.upload', validate);
function validate($event) {
const errors = validateFile($event.target.files[0]);
const isValid = errors.length === 0;
if (!isValid) {
dialogBoxService.open({
title: glossaryFilter('erreur'),
message: `
Please correct the following:
<ul class="list list--bullet">
${errors.map(err => `<li>${err}</li>`)}
</ul>
`,
});
scope.$apply();
resetFileInput();
} else {
const file = $event.target.files[0];
const fd = new FormData();
fd.append(name, file);
this.coreService.http({
method: 'POST',
url: url,
data: fd,
transformRequest: angular.identity,
headers: {
'Content-Type': undefined,
},
})
.then(then, catcher, notify);
}
}
...
function then(response) {
resetFileInput();
successCallback();
}
function catcher(err) {
console.error(err);
resetFileInput();
}
function notify(event) {
console.log(event);
}
function resetFileInput() {
elem
.off('change.upload')
.val('')
.on('change.upload', fileUploadService.uploadFile);
}
},
};
}
属性に渡された関数:
class ParentComponent {
constructor($rootScope) {
this.$rootScope = $rootScope;
}
// Because there is a `this` in here, when it is called in the
// directive, it is lost. There is no way to .bind() in the
// template, so I'm lost as how to keep the right `this`.
fileUploadOnSuccess() {
this.$rootScope.$broadcast('updateDossier');
}
}
ParentComponent.$inject = ['$rootScope'];
コンソールで0
エラー:
this
は常に(あなたがそれを.bind()
ない限り)関数が呼び出された1つであるため、それが定義されているクラスのプロパティ$rootScope
を見つけることができません。
テンプレートにthis
というバインディングを試みましたが、機能しません。
どうすればいいですか?
gouvernementales.js:5328 Uncaught TypeError: Cannot read property '$rootScope' of undefined