javascript - 使用 $mdDialog.show() 将范围项返回到父范围

标签 javascript angularjs angularjs-scope material-design angular-material

哟!我有一个 Controller ,它在其 $scope 上放置了一堆项目。其中一个范围项 $scope.openDialog 通过 $mdDialog.show() 打开一个 $mdDialog。传入 $mdDialog.show 的对象有一个模板,其中包含用于通过 ng-file-upload 项目上传文件的控件,您可以阅读有关 here 的内容。 .

如果对话窗口中上传的项目在退出对话窗口后在主 Controller 中可用,我希望如此。我不确定对话框窗口的 Controller 是应该引用主 myCtrl Controller 还是使用它自己的 Controller ,以及如何使上传的文件对 myCtrl 可用。

这是 Angular 代码:

angular.module('app', ['ngMaterial', 'ngFileUpload'])
.controller('myCtrl', ['$scope', '$mdDialog', 'Upload', function($scope, $mdDialog, Upload) {
  var tmpl = "<md-dialog>\n" +
    "<md-dialog-content>\n" +
    "    <input type=\"text\" ng-model=\"username\"></br></br>\n" +
    "    <input type=\"checkbox\" ng-model=\"multiple\">upload multiple file</br></br>\n" +
    "    watching model:\n" +
    "    <div class=\"button\" ngf-select ng-model=\"files\" ngf-multiple=\"multiple\">Select File</div>\n" +
    "    on file change:\n" +
    "    <div class=\"button\" ngf-select ngf-change=\"upload($files)\" ngf-multiple=\"multiple\">Select File</div>\n" +
    "    Drop File:\n" +
    "    <div ngf-drop ngf-select ng-model=\"files\" class=\"drop-box\" \n" +
    "        ngf-drag-over-class=\"dragover\" ngf-multiple=\"true\" ngf-allow-dir=\"true\"\n" +
    "        accept=\"image/*,application/pdf\">Drop pdfs or images here or click to upload</div>\n" +
    "    <div ngf-no-file-drop>File Drag/Drop is not supported for this browser</div>\n" +
    "    Image thumbnail: <img ngf-src=\"files[0]\">\n" +
    "    Files:\n" +
    "    <ul>\n" +
    "        <li ng-repeat=\"f in files\" style=\"font:smaller\">{{f.name}}</li>\n" +
    "    </ul>\n" +
    "    Upload Log:\n" +
    "    <pre>{{log}}</pre>\n" +
    "<md-action><div class=\"button\" ng-click=\"close()\">close!</div></md-action>\n" +
    "<md-action><div class=\"button\" ng-click=\"upload()\">upload!</div></md-action>\n" +
    "</md-dialog-content>\n" +
    "</md-dialog>";
$scope.files = ['files should appear here', 'files 1', 'file2'];
$scope.openDialog = function () {
  $mdDialog.show({
        parent: angular.element(document.body),
        template: tmpl,
        controller: 'myCtrl'
    });
};
$scope.close = function() {
  $mdDialog.hide();
};
$scope.$watch('files', function () {
    $scope.upload($scope.files);
});
$scope.upload = function (files) {
        if (files && files.length) {
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                Upload.upload({
                    url: 'upload/url',
                    fields: {'username': $scope.username},
                    file: file
                }).progress(function (evt) {
                    var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
                    console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
                }).success(function (data, status, headers, config) {
                    console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
                });
            }
        }
    };
}]); 

顺便说一句:作为内务管理注意事项,我经常听说不应将应用程序逻辑传递到 Controller 中。在这种情况下,如果 $scope.upload 引用了 $scope$scope 在工厂?

感谢您的帮助。

请联系:http://plnkr.co/edit/e2MYdEABhj34ahtPTO0g?p=preview

最佳答案

您可以将 Controller 的 $scope 传递给 $mdDialog,如下例所示

$mdDialog.show({
    parent: angular.element(document.body),
    template: tmpl,
    scope: $scope,
    controller: 'myCtrl'
});

检查插件:http://plnkr.co/edit/0hFWEyWdetTXcPLPkbmQ?p=preview

要将应用程序逻辑移至工厂,您将做这样的事情

$scope.upload = factory.upload(files,$scope.username); 

工厂会有方法

 factory.upload = function(files,username)
 {
  function (files) {
    if (files && files.length) {
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            Upload.upload({
                url: 'upload/url',
                fields: {'username': username},
                file: file
            }).progress(function (evt) {
                var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
                console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
            }).success(function (data, status, headers, config) {
                console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
            });
        }
    }
};

关于javascript - 使用 $mdDialog.show() 将范围项返回到父范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30147671/

相关文章:

Javascript:将私有(private)方法分配给私有(private)变量

javascript - 尝试用 var 而不是数字来简化 javascript。我这一切都错了吗?

javascript - 如何仅在 Angular 中使用 ng-options 来转换值

javascript - bs-modal 不显示 AngularStrap 中的内容

javascript - 将 Angular Service 对象绑定(bind)到 Controller Scope 并更新

javascript - 使用 $http 的 AngularJS 自定义表单验证

javascript - 如何通过单击按钮更改选中的下一个单选按钮?

javascript - 如何使用来自其他 SELECT 的值(在 eric hynds 的多选小部件中)使用 javascript 或 jquery 更新 html SELECT 选项

angularjs - 将 ngResource 与 webpack 结合使用

javascript - 如何在 AngularJS 中进行双向过滤?