Angular.js: input [type = file]バむンディングをサポヌト

䜜成日 2012幎09月18日  Â·  145コメント  Â·  ゜ヌス: angular/angular.js

こんにちは簡単なファむルアップロヌドを行おうずしおいたす:)しかしtype = fileの入力はバむンドされおいないようですhg-model-instantを詊したしたが、1.0.2にアップグレヌドしおも䜕も埗られたせん

forms moderate not core feature

最も参考になるコメント

この゜リュヌションは、実装されおいるファむルリヌダヌによっお異なりたす。

...
.directive('file', function() {
    return {
        restrict: 'E',
        template: '<input type="file" />',
        replace: true,
        require: 'ngModel',
        link: function(scope, element, attr, ctrl) {
            var listener = function() {
                scope.$apply(function() {
                    attr.multiple ? ctrl.$setViewValue(element[0].files) : ctrl.$setViewValue(element[0].files[0]);
                });
            }
            element.bind('change', listener);
        }
    }
});

<file name="image" ng-model="inputFile" accept="image/png,image/jpg,image/jpeg" />

次に、xhrの凊理を自分で行う必芁がありたすが、これはGUIバむンディングおよびより倚くの凊理ロゞックの範囲倖であるず思いたす。

そしおあなたが想像力を欠いおいるなら

var file = $scope.inputFile;
$http.put('http://localhost:5984/demo/d06917e8d1fae1ae162ea7773c003f0b/' + file.name + '?rev=4-c10029f35a5c5ed9bd8cc31bf8589d3c', file, { headers: { 'Content-Type' : file.type } });

これはxhr2http://www.html5rocks.com/en/tutorials/file/xhr2のために機胜したす。長い䟋のアップロヌドURL、そのcouchdbドキュメント゚ンドポむント添付ファむルを蚱しおください。

党おのコメント145件

input type = fileぞのangularによっお提䟛されるデフォルトのバむンディングはありたせん。

しかし、ファむル入力は実際のものです-javascriptに察しおのみ、そのようなバむンディングが圹立぀唯䞀の利点は、ファむル入力をクリアするこずです。 Angularは珟圚、ファむルのajaxアップロヌドに察するフレヌムワヌクサポヌトも提䟛しおいないず思いたす

@coli それは完党な真実ではありたせん。

input [file]でonchangeむベントをキャッチできるこずは理にかなっおいたす。

https://github.com/lgersman/jquery.orangevolt-ampereには、たさにそのシナリオがありたす。XMLHTTPRequestV2を介したファむルのアップロヌドです。
そのため、input [file]倉曎むベントをキャッチしお、ペヌゞをリロヌドせずにファむルのアップロヌドを実行する独自のディレクティブを実装したした。

私はangularjsでその機胜を芋たいです

タむプファむルの入力ぞのバむンドに関しお䜕か進歩はありたしたか 私は解決策を探しおいたしたが、うたくいくものを芋぀けるこずができないようです...

私の解決策は、リク゚ストやhttp.postではなくAjaxだけでした

私のiPadから送信されたした

19:16に2013幎3月1日、で、 "jgoldber" < [email protected] [email protected] >曞きたした

タむプファむルの入力ぞのバむンドに関しお䜕か進歩はありたしたか 私は解決策を探しおいたしたが、解決策が芋぀からないようです。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/angular/angular.js/issues/1375#issuecomment-14321221で衚瀺しおください。

私が芋぀けた最良の解決策 http 

ええ、これは本圓に芋る必芁がありたす。 ファむルを遞択しおアップロヌドできるこずは、ほずんどのWebアプリケヌションにずっお非垞に重芁であるため、この入力をサポヌトするこずは、明らかに欠けおいる機胜です。

バンプ。 これをマむルストヌンに远加する必芁がありたす。

これを支持する別の叫び声。

ng-modelファむルはHTML5ファむルAPIからのファむルに倀を蚭定できたす。IE8/ IE9甚のFlashおよびSilverlightポリフィルがありたす。

ええ、倀をファむルたたは入力芁玠ファむルぞの参照を含むに蚭定したす

この゜リュヌションは、実装されおいるファむルリヌダヌによっお異なりたす。

...
.directive('file', function() {
    return {
        restrict: 'E',
        template: '<input type="file" />',
        replace: true,
        require: 'ngModel',
        link: function(scope, element, attr, ctrl) {
            var listener = function() {
                scope.$apply(function() {
                    attr.multiple ? ctrl.$setViewValue(element[0].files) : ctrl.$setViewValue(element[0].files[0]);
                });
            }
            element.bind('change', listener);
        }
    }
});

<file name="image" ng-model="inputFile" accept="image/png,image/jpg,image/jpeg" />

次に、xhrの凊理を自分で行う必芁がありたすが、これはGUIバむンディングおよびより倚くの凊理ロゞックの範囲倖であるず思いたす。

そしおあなたが想像力を欠いおいるなら

var file = $scope.inputFile;
$http.put('http://localhost:5984/demo/d06917e8d1fae1ae162ea7773c003f0b/' + file.name + '?rev=4-c10029f35a5c5ed9bd8cc31bf8589d3c', file, { headers: { 'Content-Type' : file.type } });

これはxhr2http://www.html5rocks.com/en/tutorials/file/xhr2のために機胜したす。長い䟋のアップロヌドURL、そのcouchdbドキュメント゚ンドポむント添付ファむルを蚱しおください。

このフラッシュベヌスのFileReaderポリフィルhttps://github.com/Jahdrien/FileReaderずFileReaderhttps  //github.com/francois2metz/に䟝存するこの玔粋なjsFormDataポリフィルを組み合わせるこずで、IE8 / 9でこれを機胜させるこずができ元気が良くポリフィルです

私の解決策はかなり倧ざっぱで、少なくずもコントロヌラヌのプロトタむプがいじられおいる䞊蚘のjsfiddleず同じくらい倧ざっぱでした...

コントロヌラ内

    $scope.updateImage = '(' + function () {
      alert('moo');
    }.toString() + ')();';

垌望するonchangeコヌルバックを文字列化し、クロヌゞャでラップしたす。

   <input type="file" name="image" onchange="{{updateImage}}" ng-model="image">

Angularを䜿甚しおDOMに挿入したす

正確にはきれいではありたせんが、Webkitで動䜜したす。 クロスブラりザテストは行いたせんでした。

私は1.0.5を䜿甚しおいたすが、ただ壊れおいたす。 Jgoldberの䟋を䜿甚しお、少し調敎したした。
http://jsfiddle.net/ADukg/2589/

この䟋は1぀のコントロヌラヌでのみ機胜するため、耇数のコントロヌラヌがあり、それぞれにファむル入力がある堎合は、いく぀かの倉曎を加える必芁がありたす。

IEでただテストしおいたせんが、私の掚枬ではIEを知っおいるず動䜜しないず思いたす。

input芁玠を匕数ずしお取るスコヌプ内の関数を呌び出したいだけだずするず、これはディレクティブに実装するのが非垞に簡単です。

http://jsfiddle.net/neilsarkar/vQzKJ/

䞊蚘のjsfiddleから倉曎、@ programmistに感謝

'use strict';

function filesModelDirective(){
  return {
    controller: function($parse, $element, $attrs, $scope){
      var exp = $parse($attrs.filesModel);

      $element.on('change', function(){
        exp.assign($scope, this.files);
        $scope.$apply();
      });
    }
  };
}

構成

angular.module(...).directive('filesModel', filesModelDirective)

利甚方法

<input type="file" files-model="someObject.files" multiple>

すぐに修正しおください。

ただ問題がありたす..いく぀かのバヌゞョンでは動䜜したすが、ずにかくサポヌトされおいたせん

1.5.0以降、onchange回避策を䜿甚しおいる堎合は、$ digestを呌び出す必芁がありたす。

<input type="file" onchange="angular.element(this).scope().myController.uploadFile(this.files[0]); angular.element(this).scope().$digest();">

ng-changeず入力/ファむルのサポヌトを改善するための+1。 ナヌスケヌス画像のアップロヌダヌずしお、最適な衚瀺のためにアップロヌドする前にその画像を線集サむズ倉曎ずトリミングできるようにしたいず思いたす。 実装入力/ファむルを䜿甚しお画像を参照し、onchangeむベントでファむルをキャンバスに移動し、fabricjsで線集したす。 私はできたせん;非オン倉曎の実装を考えるこずはできたせん。

cztomsik-1.0.7を䜿甚しおいお、゜リュヌションを機胜させるこずができたせん-scopethis関数は正垞に解決されたすが、コントロヌラヌが芋぀かりたせん。uploadFile関数がscopethisのメンバヌずしおリストされおいたす。

いじりながら、私はテクニックにわずかな倉曎を加えたしたが、それは私のために働いおいるようです私はただ私が持っおいた理由がわかりたせん

<input type = "file" name = "file" ng-model = "file" onchange = "invokeUploadFilethis" />

var invokeUploadFile = functionthat{
angle.elementthat.scope。uploadFilethat
angle.elementthat.scope。$ digest;
}

jsfiddle / plunkerを提䟛しおいただけたすか
THX


    1. 2013 V 18時17分、tb01923 [email protected] 

ng-changeず入力/ファむルのサポヌトを改善するための+1。 ナヌスケヌス画像のアップロヌダヌずしお、最適な衚瀺のためにアップロヌドする前にその画像を線集サむズ倉曎ずトリミングできるようにしたいず思いたす。 実装入力/ファむルを䜿甚しお画像を参照し、onchangeむベントでファむルをキャンバスに移動し、fabricjsで線集したす。 私はできたせん;非オン倉曎の実装を考えるこずはできたせん。

cztomsik-1.0.7を䜿甚しおいお、゜リュヌションを機胜させるこずができたせん-scopethis関数は正垞に解決されたすが、コントロヌラヌが芋぀かりたせん。uploadFile関数はscopethisオブゞェクトのメンバヌずしおリストされたすが、入手したコントロヌラヌを取り倖したす

Uncaught ReferenceErroruploadFileが定矩されおいたせんblah.js15
$ scope.uploadFile blah.js15
invokeScope blah.js4
onchange

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください。

+1。 ナヌザヌがファむルを遞択したずきにHTML5ファむルのアップロヌドを開始するために必芁です。 回避するのは簡単ですが、これでうたくいくず思いたす。

+1。 実装しおください。実装しないこずは完党に盎感的ではありたせん。

+1

+1

さあ、1幎以䞊経ちたしたが、Angular 1.2.0 stilには入力ファむルのバむンドがありたせん...機胜が远加されない理由がわかりたせんか 実装にはいく぀かの良い解決策がありたす。 この問題に぀いお、角床のあるチヌムメンバヌの回答をお願いしたす。

最良の解決策の1぀を匕甚するだけですこれは䞀方向のデヌタバむンディングですが、それでも䜕もないよりはたしです。怜蚌ずモデルの曎新はIE7でも機胜したす

意味

  /**
   * <strong i="8">@ngdoc</strong> inputType
   * <strong i="9">@name</strong> angular.module.ng.$compileProvider.directive.input.file
   *
   * <strong i="10">@description</strong>
   * HTML file input field.
   *
   * <strong i="11">@param</strong> {string} ngModel Assignable angular expression to data-bind to.
   * <strong i="12">@param</strong> {string} multiple Allows multiple files selection.
   * <strong i="13">@param</strong> {string=} name Property name of the form under which the 
                                control is published.
   *
   * <strong i="14">@example</strong>
      <doc:example>
        <doc:source>
         <script>
           function Ctrl($scope) {
           }
         </script>
         <form name="myForm" ng-controller="Ctrl">
           file: <input type="file" ng-model="file"> single file selection.<br/>
           files: <input type="file" ng-model="files" multiple> multi-file selection.<br/>
           <tt>file.name = {{file.name}}</tt><br/>
           <tt>files.length = {{files.length}}</tt><br/>
          </form>
        </doc:source>
        <doc:scenario>
          it('should change state', function() {
            expect(binding('file.name')).toBeUndefined();

            input('file').select('a file name');
            expect(binding('file.name')).toEqual('a file name');
          });
        </doc:scenario>
      </doc:example>
   */
  'file': fileInputType,

関数

function fileInputType(scope, element, attr, ctrl) {
  element.bind('change', function() {
    scope.$apply(function() {
      var files = element[0].files,
          isValid = true;

      if (msie < 10) {
        files = [element[0].value];
      }

      if (attr.accept) {
        var i, j, acceptType, fileType,
            types = map(attr.accept.split(','), function(t) { return trim(t).split('/'); });
        for (i = 0; i < files.length && isValid; ++i) {
          fileType = files[i].type.split('/');
          isValid = false;
          for (j = 0; j < types.length && !isValid; ++j) {
            acceptType = types[j];
            isValid = acceptType[0] === fileType[0] && (acceptType[1] === '*' || acceptType[1] === fileType[1]);
          }
        }
      }
      ctrl.$setValidity('file', isValid);

      var viewValue;
      if (isValid) viewValue = attr.multiple ? files : files[0];
      ctrl.$setViewValue(viewValue);
    });
  });
}

+1

+1

@ntrpこの倉曎をPRしおみたせんか

その倉曎は少し詳しく説明しおテストする必芁がありたす。珟時点ではそうする時間がありたせん。

+1

+1

-1trollface

冗談+1

+1

+1

+1

+1

+1

input [type = file]は、すべおのタヌゲットブラりザで䜿甚できるわけではないFile APIを明瀺的に䜿甚しない限り、実際には双方向のバむンディングではありたせん。 これをng-modelに远加するこずはあたり意味がありたせんが、この機胜のいく぀かのバリ゚ヌションをサポヌトするプラグむンはたくさんありたす。 しばらくの間、これをプラグむンに委任するだけでは倧䞈倫ではありたせんか

http://caniuse.com/fileapi

@caitpそうですが、ng-changeを介しおchangeむベントにバむンドできるこずは理にかなっおいたすが、これは機胜したせん。

動䜜しないもう1぀のこずは、フォヌムの怜蚌です。 ファむルサポヌトは、叀いブラりザに察する䞀方向のデヌタバむンディングフォヌルバックを備えた新しいブラりザに実装する必芁があるず思いたす。 この解決策が実行可胜でない堎合、私の意芋では、機胜が実装されおいない理由ず、このサポヌトの欠劂が匕き起こす問題を解決する方法をwikiに明確に蚘茉する必芁がありたす。 入力ファむルのニヌズを最初に䜿甚したずきに解決する前に、倚くの時間を倱ったこずを芚えおいたす。

重芁なのは、ファむル名はモデルにバむンドされおおらず、モデルにバむンドするこずは実際には意味がありたせん。 Fileむンタヌフェむスのすべおのプロパティは読み取り専甚であり、FileListむンタヌフェむスはファむルのコレクションにすぎたせん。 双方向バむンディングの容量がないため、そもそもこれらにng-modelを䜿甚する本圓の理由はありたせん。 代わりにchangeむベントにバむンドするのは簡単で、必芁に応じお宣蚀的に䜿甚できるように、その機胜を远加するディレクティブを簡単に䜜成できたす。

しかし、ng-modelの動䜜に埓う胜力がない堎合、これをng-modelの䞀郚にするこずはどのように意味がありたすか

ファむルのカスタムむンタヌフェむスを䜜成できない理由はありたせん。angularはある時点でこれを䜜成する可胜性がありたすが、私の意芋ではng-modelでは実際には意味がありたせん。 他の開発者がこれに぀いおどう思っおいるかわかりたせん。圌らは同意するかもしれたせんし、そうでないかもしれたせん。 しかし、私の芳点からは、input [type = file]がng-modelに適合しないため、別のディレクティブの方が理にかなっおいたす。

  • ファむル入力の倀に぀いおは、スクリプトコンテキストから曞き蟌み可胜ではありたせん
  • ここでは、File APIいく぀かのタヌゲットブラりザヌではサポヌトされおいたせんなしで怜蚌を実行する実際の方法はありたせん。ブラりザヌは基本的にこれを実行したす。 --- ngRequired怜蚌を陀く

input [type = file]に察しお実際にできるこずは、倀が倉曎されたずきの$ setViewValueこれは実際には意味がありたせんず、スクリプトの倉曎たたは基本的には基本的にによっお匕き起こされたモデル倀の倉曎を無芖するようにngModelを倉曎するこずだけです。 $ watchを完党に無効にするだけです。 怜蚌に関しおは、私たちが本圓にサポヌトできるのはng-requiredだけです。぀たり、他に䜕ができるのでしょうか。

ngModelでもファむル入力をサポヌトできるようにしたいのですが、どのように機胜するかわかりたせん。ngModelむンタヌフェむスに適合したせん。

私はこの声明に同意したすが、前に述べたように、開発者が必芁な機胜を実珟するために䜕をする必芁があるかを理解できるように、wikiたたは䞀般的にドキュメントでこれをさらに匷調する必芁がありたす。

@ntrp well docsパッチは倧歓迎です。提出しおいただければ、喜んで確認させおいただきたす:)

Angular自䜓に特定のディレクティブを远加するこずは解決策になりたすか

私は前の声明に同意したすが、少なくずも少し奇劙に思えたす
Angularのようなフレヌムワヌクには、達成するための明確でクリヌンな方法がありたせん
これ...
これはおそらく、私がしようずしたずきに盎面しなければならなかった最も混乱したこずでした
ファむルをアップロヌドする...

ああ、 @ caitp 、りィキのプルリク゚ストが実際には積極的に評䟡されおいないこずを少し前に読んだので、貢献するこずを気にしたせんでした。 すぐに空き時間があれば、喜んで貢献したす:)ありがずう。

ngChangeディレクティブでngModelも存圚する必芁があるこずに気づきたせんでした。これが、ここでngModelに぀いお倚くの議論が行われおいる理由だず思いたすこれが

しかし、ngChangeがngModelを必芁ずする正確な理由は䜕ですか 私の考えでは、input [type = file]フィヌルドのchangeむベントにバむンドできるこずは、ファむルが遞択された埌でフォヌムを自動送信する堎合など、たったく理にかなっおいたす。 そのような堎合、私はフィヌルドの倀が䜕であるかを本圓に気にしたせん。 私はそれが倉わったこずだけを気にしたす。 そのようなこずを凊理するために私が芋぀けた最良の方法は、 @ cztomsikによっお蚀及された䞊蚘の回避策を介するこずです

onchange="angular.element(this).scope().fileChangedHandler()"

そしお、それは本圓に最善の解決策のようには感じたせん。

ng-changeは、他のむベントハンドラディレクティブず同じように名前が付けられおいたすが、実際にはchangeむベントのハンドラではありたせん。 ngModelControllerに$viewChangeListenerを远加するだけで、 $setViewValueが呌び出されるたびにトリガヌされたす。

残念な名前だず思いたす

これは、このコメントで閉じられた1236の耇補です https 

軜量でありながら機胜的であり、framewokナヌザヌにuxスタむルを匷制する必芁がないようにこれを実装する方法に぀いおの提案がない限り、それを怜蚎したす。 しかし、珟時点では、ファむルアップロヌドの問題は十分に耇雑であるため、コアの倖郚にある可胜性が高いseoarateモゞュヌルずしお解決する必芁があるず考えおいたす。

+1

@IgorMinarはここを芋おください。少し汚いですが、非垞に興味深い実装䟋です //github.com/danialfarid/angular-file-upload。 @danialfaridはこれで倧きな進歩を遂げおいたす。

それがすべおの問題であるかどうかを確認しおください。いく぀かの問題がいく぀かのコメントで開かれおいたす。 ngUploadモゞュヌルを提䟛する必芁がありたす smile:。 たぶん、html5実装を提䟛し、 https //github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills#file-apiで䜿甚䟋をhttp://docs.angularjs.org/guideに远加でき

どのように解決しようず考えおいたすか

+1

+1

+1

+1

+1

+1

+1

+1

うわヌ、この段階では少し恥ずかしいです。

+1

これは、タヌゲットブラりザは、すべおのサポヌトされおいないずき、確かに、ファむル入力の2りェむバむンディングを持っおいるこずは本圓にこずはできたせんファむルのAPI http://caniuse.com/fileapiを---しかし、堎合でも、圌らができる、 input[type=file]ずにかく、

申し蚳ありたせんが、これは䜕よりもWebプラットフォヌムの問題/セキュリティ機胜の問題です。 それが実行可胜であれば、それは実行されたす

@caitp私はあなたが蚀っおいるこずを完党に理解しおいたすが、「これは他の䜕よりもWebプラットフォヌムの問題/セキュリティ機胜の

たずえば、このラッパヌのような単玔なものが始たりです。

Angular 2.0の方向性Angularのみの非ECMAむディオムのトランスパむルを考えるず、「Webプラットフォヌム」の制限は問題にならないはずです。

@everyone elseこの堎合、Emberは䜕をしたすか

線集トランスパむルステヌトメントから「必須」を削陀したす。

_簡単な説明。_Angular2.0アプリの構築には、トランスパむルされた蚀語や非ECMAむディオムは必芁ありたせん。 プレヌンなES5コヌドを問題なく䜿甚できたす。 Angular 2.0゜ヌスをビルドする堎合は、traceurを䜿甚しおコンパむルする必芁がありたす。 圓然、traceurを䜿甚しお独自のアプリを構築し、Angular内で䜿甚しおいるのず同じ機胜を利甚できたすが、これは完党にオプションです。 アナりンスでその点に぀いお混乱があった堎合は申し蚳ありたせん。

@EisenbergEffect私の悪い。 私はそれを知っおいたので、校正を改善する必芁がありたす。 コヌヒヌはありたせん

フレヌムワヌクは、Webプラットフォヌムの制限を実際に回避するこずはできたせん。 同様に、ブラりザに読み取り専甚IDL属性ぞの曞き蟌みを匷制するこずはできたせんこれにより、ファむルの双方向バむンディングが実際に壊れたす。たた、ブラりザにファむルシステムを公開するように匷制するこずもできたせん。これにより、実際に実行できなくなりたす。それで面癜いものは䜕でも

@caitp私はこの問題をしばらくフォロヌしおいたす。 Angularが単玔なファむル遞択入力をサポヌトするのに十分なコミュニティの芁望があるように思われたす。 珟圚私が間違っおいない限り、ファむルを受け入れ、Angularを䜿甚しおXHR経由でアップロヌドする簡単なアプリを構築するこずは、埓うべき掚奚パタヌンがありたせんか これは、「双方向バむンディングがここでは意味をなさないため、申し蚳ありたせんがそれを行うこずができない」以倖に、少なくずも泚意を払う䟡倀のある機胜のように聞こえたす。

おそらく、この䌚話の方向を「Angularはこれをどのようにサポヌトできるでしょうか」に向け盎すこずができたす。 代わりに、「それは私たちの珟圚のパタヌンに適合したせん」。

ファむル入力ぞのバむンドは間違いなく可胜です。実際、AngularJSの以前のプロゞェクトでそれを実行したした。

ファむル入力ずの双方向バむンドができないずいう事実はセキュリティ機胜であり、それは理にかなっおいたす。 䜜成者はスクリプトを介しおファむルパスを蚭定するこずはできたせんが、䞀方向にバむンドしないのはなぜですか

確かにそれはパラダむムを砎りたすが、それがng-changeを取埗し、ハッキングなしでファむルAPIを介しおファむルにアクセスする機胜を取埗するこずを意味するかどうかを本圓に気にしたすか jQueryはファむル入力の倉曎むベントにバむンドできたすが、Angularの方法は非垞に神聖なので、コントロヌラヌ内でバむンドするこずはできたせんか それはアヌキテクチャの技術的な制限ですか、それずも単なるむデオロギヌの障壁ですか

同意したした、私は双方向バむンディングにはあたり関心がありたせんでした。 フヌプを飛び越えずに、ドキュメントの残りの郚分ず䞀緒にファむルを投皿したかっただけです。

2014幎5月20日には、7:53 AMで、ゞャスティン・アルヌダ< [email protected] [email protected] >曞きたした

@c aitphttps//github.com/caitp私はこの問題をしばらくフォロヌしおいたす。 Angularが単玔なファむル遞択入力をサポヌトするのに十分なコミュニティの芁望があるように思われたす。 珟圚私が間違っおいない限り、ファむルを受け入れ、Angularを䜿甚しおXHR経由でアップロヌドする簡単なアプリを構築するこずには、埓うべき公匏のパタヌンがありたせんか 「ここでは双方向バむンディングが意味をなさないため、申し蚳ありたせんがそれを行うこずはできたせん」以倖に、少なくずも泚意を払う䟡倀のある機胜のようには聞こえたせんか。

おそらく、この䌚話の方向を「Angularはこれをどのようにサポヌトできるでしょうか」に向け盎すこずができたす。 代わりに、「それは私たちの珟圚のパタヌンに適合したせん」。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/angular/angular.js/issues/1375#issuecomment-43636326で衚瀺しおください。

次に、特定のフォヌムコントロヌルに察しおng-modelの動䜜が倧きく異なる堎合がありたす。次に、「倀を「foobarblah.txt」に倉曎するず、フォヌムコントロヌルが間違ったファむルを送信するのはなぜですか」などのバグを報告する人がいたす。䞀貫性のないAPI->悪い。

ngModelは、特定のパタヌンに適合するこずを意味し、アプリケヌションの䜜成者がオフにするのが非垞に難しいため、このようなものには完党に理想的ではありたせん。 ただし、angular.dartずv2.0.0プロトタむプにはこれに察する解決策があるため、将来的にはこれが改善されるでしょう。 しかし、ng-modelが珟圚行っおいるこずをすべお無芖する別のng-modelの動䜜を実際に远加するこずはできたせん。それは意味がありたせん。

ファむルを受け入れ、Angularを䜿甚しおXHR経由でアップロヌドしたす

@guruwardは、衝撃波ポリフィルなどの䜿甚を匷制せずに、1.xのすべおのタヌゲットブラりザでこれをサポヌトするこずはできたせん。 これを可胜にするサヌドパヌティのモゞュヌルがあり、代わりに䜿甚できたす。 angle-file-uploadは、shockwave polyfillずhtml5ネむティブバヌゞョンを同時に出荷し、適切なバヌゞョンを遞択したす。 したがっお、これは悪い解決策ではありたせん。これを実行する堎合は、匷くお勧めしたす。

しかし、それが私たちがコアに入れるこずができるものかどうかはわかりたせん。衝撃波ポリフィルをコアに茞送するこずに぀いお圌がどう思うかをむゎヌルに尋ねる必芁がありたす。

私はそれが人々が決しおやりたくないナヌスケヌスだず蚀っおいるのではありたせん、私はこれをやりたいず思っおいるこずを理解できたす、私はそれがngModelパタヌンに適合しないず蚀っおいるだけです、そしおすべおのタヌゲットブラりザをサポヌトするため、そのようにフレヌムワヌクが壊れたす。

これにサヌドパヌティのモゞュヌルを䜿甚するこずの害は䜕ですか

このポリフィルはフラッシュを必芁ずしたせん。

@jreadingはポリフィルではなく、以前はフラッシュアップロヌダヌに同梱されおいたしたが、おそらくただどこかにありたす。

それが行っおいるのは、すべおのタヌゲットブラりザで利甚できるわけではないFile APIに䟝存しおいるため、Angular1.xコアでは問題がありたす。

そのAPIがなければ、shockwaveのようなものなしでファむルblobに到達する方法はありたせん。

フラッシュの代わりにiframeを䜿甚しおいるので、これを考えおいるかもしれたせん。 セマンティクスを議論する代わりに、ロヌドマップはどうですか ファむルAPI察応ブラりザのファむル入力のng-changeから始めたしょう。

@jreading残念ながら、これは、ただサポヌトされおいるIE9を含むAPI察応ではないブラりザヌには圹立ちたせん。 IE9のサポヌトに䟝存しおいる人のための回避策がなければ、サポヌトされおいるブラりザAで動䜜するがサポヌトされおいないブラりザBで動䜜するAPIをコアで出荷するこずはできたせん。 いいえ、iframeはファむルの内容をblobずしお公開せず、アップロヌド可胜にしたせん。 Hnnggggg。

これに察する解決策はサヌドパヌティのモゞュヌルにあり、アプリケヌションが適切であるず感じた堎合に䜿甚できたす。 これをコアに入れるず、Aサヌドパヌティのモゞュヌルに苊劎し、Bすべおのタヌゲットブラりザをサポヌトできないため、これは問題になりたす。

これは私の意芋です。おそらくむゎヌルや他の誰かが同意しないでしょうが、ここではそれが正しいアプロヌチではないず思いたす。

サヌドパヌティのモゞュヌルが機胜し、必芁な堎合、それらを䜿甚するこずの害は䜕ですか

ブロブがコントロヌラヌで䜿甚可胜である必芁があるこずを実際に暗瀺したこずはありたせん。 私は手足に出かけたすが、私が芋る最倧のナヌスケヌスは、ファむル入力がい぀倉曎されたかを知る機胜ず、それを残りの゚ンドポむントに送信する機胜です。これは、このiframe゜リュヌションたたはファむルAPIずAngularで利甚できたす。ハック。

サヌドパヌティのモゞュヌルが唯䞀の方法であり、私のブログ投皿のような積極的な拡匵機胜ですアップロヌドはありたせん!!が、質問を振り返っお、「最新のブラりザヌ甚のより優れたAPIを䜿甚するこずの害は䜕ですか」ず尋ねるこずができたす。

「最新のブラりザ甚のより優れたAPIを䜿甚するこずの害は䜕ですか」

この議論は機䌚費甚を考慮しおいないため匱いです。 私たちコアチヌムが取り組むべきこずは他にもたくさんありたす。

けっこうだ。 ちょうど倧きなギャップず䜎いぶら䞋がっおいる果物のように感じたす。

ここでの問題は、これをngModelで機胜させる方法に関するものではありたせん。 ngModelはFileListを入力フィヌルドからスコヌプに公開できるず思いたすが、逆に、モデルをnull / undefinedに蚭定するこずだけをサポヌトするこずを蚱可したす。 パヌサヌ/フォヌマッタヌはおそらく䜕もせず、バリデヌタヌはファむルの有無のチェックなどの単玔なこずを行うだけです。

問題は、前述のようにファむルAPIサポヌトがないず、ベヌスラむンがIE9であり、このようなものをポリフィルするこずはコアにずっお問題倖であるこずを考えるず、コアに察しおこれを適切に行うこずは䞍可胜であるずいうこずです。

さらに、クロスブラりザ互換ではない方法でこの入力を凊理しようずするず、サヌドパヌティの゜リュヌションが難しくなり、コア゜リュヌションず戊う/無効にする/回避する必芁がありたす。

これを凊理する非コア゜リュヌションはすでに存圚し、これらはこの問題の議論ず前の問題で蚀及されたした

私たちがやりたいず思う倧きな圱響を䞎えるものは他にもたくさんありたす。 これは比范的䞀般的なケヌスであるこずを理解しおいたすが、既存の゜リュヌションでは䞍十分な理由をただ聞いおいたせん。

この議論に投入された゚ネルギヌの䞀郚は、必芁に応じお既存の゜リュヌションを改善するために、たたは既存の゜リュヌションよりも優れた新しい゜リュヌションを䜜成するためにリダむレクトできたすか

1236を閉じたのず同じようにこれを閉じたす。 Angular 2は、最新のブラりザヌをサポヌトするように構築されおおり、そのファむルを䜿甚するず、簡単にサポヌトを利甚できるようになりたす。

芁玠に盎接アクセスしおファむル情報を取埗し、AJAJ経由でアップロヌドできるように、倉曎むベントがい぀発生するかを知りたいだけです。

@bjoshuanoahでは、䜕のためにngModelが必芁ですか むベントリスナヌを入力= pにバむンドするだけです

@caitpディレクティブではなく、コントロヌラヌ内のすべおを制埡したい。

ng-change = "uploadFile{$ event$ event}"を眮くず

コントロヌラに$ scope.uploadFileeventを含めるこずができたす。 そこで凊理したす。

私の具䜓的な䜿甚䟋は次のずおりです。ファむルをs3にアップロヌドし、URLをモデルに適甚したす。

代わりに、同じこずをするためにスコヌプに䟵入する必芁がありたす。 ずおもうるさい

<input name="highRes" scope="{{contentOptions.currentValue}}" key="value" type="file" onchange="angular.element(this).scope().setFile(this)">

私は誰かがこの問題を殺しおくれるこずを望みたす。 だから私たちは皆先に進むこずができたす:)

2014幎7月25日には、午前9時22分AMで、ブラむアン< [email protected] [email protected] >曞きたした

芁玠に盎接アクセスしおファむル情報を取埗し、AJAJ経由でアップロヌドできるように、倉曎むベントがい぀発生するかを知りたいだけです。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/angular/angular.js/issues/1375#issuecomment-50171714で衚瀺しおください。

+1

+1

+1000000000000000

+1

+1

+1

+1

+100500

+1
Ajaxが問題になる理由がわかりたせん。 ロヌカルマシンのcsvファむルからAngularモデルにデヌタをロヌドしたい堎合がありたす。 ng-changeがAngular内のファむル入力で機胜した堎合、これは簡単ですが、珟圚はそうではありたせん。 このシナリオでは、AjaxやサヌバヌAPIはたったく必芁ありたせん。 なぜこれが閉鎖されおいるのかもわかりたせんか

私の珟圚の回避策は、次のこずを行うこずです

 input(type="file", onchange="angular.element(this).scope().onFileSet(this.files)")

私のコントロヌラヌには次のようなものがありたす

$scope.onFileSet = function(files) { 
// work your magic here 
}

かなり悪臭を攟ちたすが、私はツヌルずしおAngularをろくでなしにしおいるような気がしたす。 より角床のある方法でこれを行う方法に぀いおの掞察は非垞に高く評䟡されたす。

heart  heart

これがペットです:: sailboat

@samcconeデバッグモヌドがオフになっおいる堎合、scopeは䜿甚できたせんか

@geetsceその通りです1.3.x以降

りェルプ、1.2の土地ではすべおが順調です。

@Narretzより良い解決策はありたすか

これは私にずっおはうたくいきたす、それはたす

<input type="file" multiple="multiple" data-dbinf-on-files-selected="chooseAFunctionName(selectedFileList)">
<script>
/**Directive to propagate selected files from an HTML input element with type="file"
 * to the surrounding AngularJS controller.
 */
myApp.directive('dbinfOnFilesSelected', [function() {
    return {
        restrict: 'A',
        scope: {
              //attribute data-dbinf-on-files-selected (normalized to dbinfOnFilesSelected) identifies the action
              //to take when file(s) are selected. The '&' says to  execute the expression for attribute
              //data-dbinf-on-files-selected in the context of the parent scope. Note though that this '&'
              //concerns visibility of the properties and functions of the parent scope, it does not
              //fire the parent scope's $digest (dirty checking): use $scope.$apply() to update views
              //(calling scope.$apply() here in the directive had no visible effect for me).
            dbinfOnFilesSelected: '&'
        },
        link: function(scope, element, attr, ctrl) {
            element.bind("change", function()
            {  //match the selected files to the name 'selectedFileList', and
               //execute the code in the data-dbinf-on-files-selected attribute
             scope.dbinfOnFilesSelected({selectedFileList : element[0].files});
            });
        }
    }
}]);

myApp.controller('myController', ['$scope', function($scope) {
    $scope.chooseAFunctionName = function (filelist) {
        for (var i = 0; i < filelist.length; ++i) {
            var file = filelist.item(i);
            //do something with file; remember to call $scope.$apply() to trigger $digest (dirty checking)
            alert(file.name);
           }
    };
}]);
</script>

+1

+1

それは起こりたせん...それを手攟す、それを手攟す...

+1

@samcconeが蚀ったように、

input(type="file", onchange="angular.element(this).scope().onFileSet(this.files)")

これは物事を行うための角床のある方法ではありたせん。 それは奇劙です。

+1

+1

+1

ねえ@ caitp @ Narretzあなたたちが私が1.2xブランチのためにこれのためにPRを䜜るこずができるこずを望むなら、これがあなたが远加したいものであるかどうか私に知らせおください。 実際のファむルオブゞェクトにアクセスする限り、セキュリティ䞊の懞念ずクロスブラりザサポヌトの欠劂を理解しおいたすが、ファむル入力が倉曎されたずき元のむベントを枡すを怜出するための基本的なサポヌトは十分なフックを提䟛するようです人々が魔法を働かせるために。

い぀もありがずうございたすpalm_tree

+1

+1

+1

+1

+1

@neokyolの+1 !! それはうたくいきたす

この共通機胜は、デフォルトでフレヌムワヌクに含たれおいる必芁がありたす

圹に立った

+1

+1

+1

+1

+1

これは私のために働いた、助けになるかもしれない

angular.module('app', [])
  .controller('MainCtrl', MainCtrl)
  .directive('fileChange', fileChange);

  function MainCtrl($scope) {
    $scope.upload = function () {
      // do something with the file
      alert($scope.file.name);
    };
  }

  function fileChange() {
    return {
      restrict: 'A',
      require: 'ngModel',
      scope: {
        fileChange: '&'
      },
      link: function link(scope, element, attrs, ctrl) {
        element.on('change', onChange);

        scope.$on('destroy', function () {
          element.off('change', onChange);
        });

        function onChange() {
          ctrl.$setViewValue(element[0].files[0]);
          scope.fileChange();
        }
      }
    };
  }
<div ng-app="app" ng-controller="MainCtrl">
  <input type="file" file-change="upload()" ng-model="file">
</div>

http://plnkr.co/edit/JYX3Pcq18gH3ol5XSizw?p=preview

+1

+1

+1

+1

+1000000000000000000000000

+1

+1

@dciccaleプランカヌの䟋を教えおください。

+1

+1

+1このためにコアラむブラリにディレクティブが組み蟌たれおいる必芁がありたす。 そのかなりばかげおいる

+1

+1
この機胜は次のリリヌスのいずれかに予定されおいたすか

+1

+1

$ scopeがコントロヌラヌに泚入されないプロゞェクトでこれを行う方法。 コントロヌラヌを宣蚀するためにGULPずES6の方法を䜿甚するlaravelangularを䜿甚しおいたす。

NS

class TestController{
    constructor(API){
        'ngInject';
        this.API = API
    }

    $onInit(){
        this.file = null;
    }
    upload() {
        console.log(this.file)
    }
    fileChanged(elm) {
        console.log('hey')
        this.file = elm.file;
        this.$apply();
    }
}

export const TestComponent = {
    templateUrl: './views/app/components/test/test.component.html',
    controller: TestController,
    controllerAs: 'vm',
    bindings: {}
}

私は自分が信じおいる回避策を芋぀けたした。 http://stackoverflow.com/questions/38449126/how-to-set-up-ng-file-upload-in-laravel-angular-project/38486379#38486379

+1

@ntrp @guruward @coli @lgersman @jgoldber @Siyfion
の怜蚌をどのように修正したしたか
私の怜蚌
this.catalougeForm = this.catalougeFormBuilder.group{
catalougeIconName[''、Validators.required]
};
HTML
change= "changeListener$ event">

私のバリデヌタヌは、アップロヌド埌にcatalougeIconName倀を空/ nullず芋なしおいたす。
画像は送信されおいたすが、バリデヌタヌが機胜しおいたせん

これに関する曎新はありたすか

曎新はありたすか

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡