【发布时间】:2016-11-18 01:36:12
【问题描述】:
尝试将自定义 onchange 处理程序绑定到输入文件元素。收到以下错误:
不允许在 Angular 表达式中引用 DOM 节点!表达式:setRuleFile(element
有什么办法可以解决吗?
谢谢。以下是我的代码的相关摘录。
html:
<input type="file" on-select-file="setRuleFile(element)"/>
控制器:
$scope.setRuleFile = function(element) {
// Extract selected file name
var pathArray = element.value.split('\\');
$scope.data.ruleFileName = pathArray[pathArray.length - 1]; // take only name without path
$scope.data.ruleFile = element;
}
指令:
angular.module('myModule').directive('onSelectFile', function ($parse) {
// Triggered when user selects file
return {
restrict: 'A',
link: function (scope, element, attrs) {
// Get callback into variable and bind it to onchange handler
onSelectFileFunc = $parse(attrs.onSelectFile);
//console.log(onSelectFileFunc(scope, {'element': element}));
element.bind('change', function() { onSelectFileFunc(scope, {'element': element}); } );
}
};
})
【问题讨论】:
-
为什么需要将元素传递给控制器?控制器不应该对 dom 有任何了解。此外,您已经在指令中公开了元素。你到底想做什么?
-
@charlietfl:那我该如何提取文件名呢?之后我还需要使用文件阅读器: var reader = new FileReader(); reader.readAsArrayBuffer($scope.data.ruleFile.files[0]);而且,正如您从我的代码中看到的那样, $scope.data.ruleFile = element;如果我不使用元素,我该如何实现?谢谢。
-
读取指令中的所有文件数据。使用隔离范围绑定方法或模型对象进行更新。所有控制器都应该关心的是数据本身
-
传递$event而不是dom,并在代码中使用$event.target
标签: javascript angularjs