【发布时间】:2017-05-29 09:48:54
【问题描述】:
在 angularjs 项目中,我使用指令通过将文件拖放到 dropzone 中来上传文件。在指令中,我需要调用在我的控制器中定义的函数。
这是我正在做的事情:
(function () {
'use strict';
angular
.module('app')
.controller('myController', myController)
.directive('fileDropzone', function () {
return {
restrict: 'A',
scope: {
file: '=',
fileName: '=',
test: '&callbackFn',
},
link: function (scope, element, attrs) {
var processDragOverOrEnter;
processDragOverOrEnter = function (event) {
if (event != null) {
event.preventDefault();
}
event.dataTransfer.effectAllowed = 'copy';
return false;
};
element.bind('dragover', processDragOverOrEnter);
element.bind('dragenter', processDragOverOrEnter);
return element.bind('drop', function (event) {
var file, reader;
if (event != null) {
event.preventDefault();
}
reader = new FileReader();
reader.onload = function (evt) {
console.log(reader.result);
scope.test({});
};
file = event.dataTransfer.files[0];
reader.readAsText(file);
return false;
});
}
};
});
function myController()
{
var vm = this;
vm.test = function () {
console.log("It works !");
};
}
})();
html 文件:
<div class="container">
<md-content file-dropzone layout="column" layout-align="center center" class="md-list-item-text" md-whiteframe="1" style="padding:1em;margin:0.5em 0.5em;" flex>
File drop zone
</md-content>
</div>
虽然 console.log(reader.result) 指令确实在控制台中显示文件内容,但消息“It works !”没有显示,这意味着函数 test() 永远不会被调用。
我做错了什么?
【问题讨论】:
-
同时添加 HTML 文件信息..
-
因为您已经创建了隔离作用域,那么您在任何控制器内部使用指令的地方都会获得它的实例,使用
ctrl作为链接函数的第四个参数 -
然后就可以调用控制器的功能了
-
我们可以将 myController 注册为指令控制器吗?
-
你错过了在 html 文件的指令元素中添加 callback-fn="vm.test()"
标签: angularjs angularjs-directive