2016-07-01 8 views
2

Ich habe eine Direktive, die ein Datei-Upload-Eingabefeld auf dem DOM platziert, und ich möchte dann die Möglichkeit, eine Funktion aufzurufen, wenn diese Datei geändert wird. Wie kann ich eine On-Change-Funktion erhalten, ohne sie im Compiler-Bereich zu platzieren? Ich weiß, dass es nicht dorthin gehört, da mir gesagt wurde, dass der Compiler speicherintensiver ist und nur für Pre-Render-Sachen verwendet werden sollte.Angular benutzerdefinierte Direktive ruft Funktion bei Änderung des Eingabefeldes

angular.module('myApp').directive('customDirective', ['$http', function ($http) { 

    return { 
    controller() { 

    }, 
    compile(element) { 
     const $fileinput = $('<input type="file" accept=".csv">').appendTo(element); 
     return { 
     controller:() => { 
      $fileinput.on('change', (e) => { 
      // Stuff happens 
      }); 
     }, 
     link:() => { 
     }, 
     }; 
    }, 
    }; 
}]); 

Antwort

1

dies stattdessen versuchen:

<p> 
    Select a file, and you should see an alert message 
</p> 

<div ng-app="myApp" ng-controller="myCtrl"> 
    <input type="file" custom-on-change="uploadFile"/> 
</div> 

var myApp = angular.module('myApp', []); 
myApp.directive('customOnChange', function() { 
    return { 
    restrict: 'A', 
    link: function (scope, element, attrs) { 
     var onChangeFunc = scope.$eval(attrs.customOnChange); 
     element.bind('change', onChangeFunc); 
    } 
    }; 
}); 


myApp.controller('myCtrl', function($scope) { 
    $scope.uploadFile = function(){ 
     var filename = event.target.files[0].name; 
     alert('file was selected: ' + filename); 
    }; 
}); 

hier die Arbeits fiddle

+0

ist, ich dachte, dass Sie nur ng Wechsel mit ng-Modell verwenden könnte? ng-Modell funktioniert nicht mit einer Datei:/https://docs.angularjs.org/api/ng/directive/ngChange –

+0

@ToriHuang Ich habe meinen ursprünglichen Beitrag bearbeitet. Dies sollte für das funktionieren, was Sie brauchen –

+0

Das ist super Detail, danke! –