<input type="file">
要素からファイル アップロード ファクトリにファイル名を送信する AngularJS ディレクティブを作成しようとしています。この作品は、次のブログ投稿に基づいています。
http://odetocode.com/blogs/scott/archive/2013/07/05/a-file-input-directive-for-angularjs.aspx
HTML 要素が定義されています。
<div file-input="file" on-change="readFile()"></div>
関連するディレクティブを設定すると:
myApp.directive('fileInput', function ($parse)
{
return {
restrict: "A",
template: "<input type='file' />",
replace: true,
link: function (scope, element, attrs) {
var model = $parse(attrs.fileInput);
var onChange = $parse(attrs.onChange);
element.bind('change', function () {
model.assign(scope, element[0].files[0]);
console.log(element[0].files[0]); // correctly references selected file
scope.$apply();
console.log(model(scope)); // correctly references selected file
onChange(scope);
});
}
};
});
要素からファイルを選択すると、change
イベントが発生し、両方のconsole.log
呼び出しで、選択したファイルへの参照が出力されます。しかし、コントローラーで印刷しようとすると$scope.file
、ファイルの選択が反映されません。
$scope.file = "nothing";
$scope.readFile = function()
{
$scope.progress = 0;
console.log($scope.file); // print "nothing"
fileReaderFactory.readAsDataUrl($scope.file, $scope)
.then(function (result) {
$scope.imageSrc = result;
});
};
コントローラーがディレクティブから送信された値を適切に設定および保持できない原因は何ですか?
アップデート
次の更新を行いましたが、スコープ変数がまだ更新されていません。私の変更関数が呼び出されましたが、 に与えられた新しい値に気づきませんmyModel
。
HTML:
<file-input my-model="fileRef" my-change="readFile()"></file-input>
ディレクティブ (タグをテスト目的でinput
更新):text
myApp.directive('fileInput', function ($parse)
{
return {
restrict: "AE",
template: "<input type='text' />",
replace: true,
scope: {
myModel: "=",
myChange: "&"
},
link: function (scope, element, attrs) {
element.bind('change', function () {
scope.myChange();
});
}
};
});
コントローラ:
$scope.fileRef = "nothing";
$scope.readFile = function()
{
$scope.progress = 0;
console.log($scope.fileRef); // prints "nothing"
fileReaderFactory.readAsDataUrl($scope.fileRef, $scope)
.then(function (result) {
$scope.imageSrc = result;
});
};