1. ホーム
  2. angularjs

[解決済み] `<input type="file"/>` の ng-model (ディレクティブ DEMO 付き)

2022-04-02 17:28:31

質問

type fileのinputタグにng-modelを使おうとしています。

<input type="file" ng-model="vm.uploadme" />

しかし、ファイルを選択した後、コントローラで、$scope.vm.uploadmeは未定義のままです。

選択したファイルをコントローラで取得するにはどうすればよいですか?

どのように解決するのですか?

ディレクティブで回避策を作りました。

.directive("fileread", [function () {
    return {
        scope: {
            fileread: "="
        },
        link: function (scope, element, attributes) {
            element.bind("change", function (changeEvent) {
                var reader = new FileReader();
                reader.onload = function (loadEvent) {
                    scope.$apply(function () {
                        scope.fileread = loadEvent.target.result;
                    });
                }
                reader.readAsDataURL(changeEvent.target.files[0]);
            });
        }
    }
}]);

そして、inputタグはこうなる。

<input type="file" fileread="vm.uploadme" />

あるいは、ファイル定義だけが必要な場合。

.directive("fileread", [function () {
    return {
        scope: {
            fileread: "="
        },
        link: function (scope, element, attributes) {
            element.bind("change", function (changeEvent) {
                scope.$apply(function () {
                    scope.fileread = changeEvent.target.files[0];
                    // or all selected files:
                    // scope.fileread = changeEvent.target.files;
                });
            });
        }
    }
}]);