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

前端之家收集整理的这篇文章主要介绍了javascript – 使用$mdDialog.show()将范围项返回到父范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
呦!我有一个控制器,在其范围内容纳了一堆物品.其中一个范围项$scope.openDialog通过$mdDialog.show()打开$mdDialog.传递给$mdDialog.show的对象有一个模板,其中包含通过ng-file-upload项目上传文件的控件,您可以阅读有关 here内容.

如果在退出对话框窗口后,在对话框窗口中上传的项目在主控制器中可用,我希望这样.我不确定对话框窗口的控制器是应该引用主myCtrl控制器还是使用它自己的,以及如何将make上传文件提供给myCtrl.

这是角度代码

  1. angular.module('app',['ngMaterial','ngFileUpload'])
  2. .controller('myCtrl',['$scope','$mdDialog','Upload',function($scope,$mdDialog,Upload) {
  3. var tmpl = "<md-dialog>\n" +
  4. "<md-dialog-content>\n" +
  5. " <input type=\"text\" ng-model=\"username\"></br></br>\n" +
  6. " <input type=\"checkBox\" ng-model=\"multiple\">upload multiple file</br></br>\n" +
  7. " watching model:\n" +
  8. " <div class=\"button\" ngf-select ng-model=\"files\" ngf-multiple=\"multiple\">Select File</div>\n" +
  9. " on file change:\n" +
  10. " <div class=\"button\" ngf-select ngf-change=\"upload($files)\" ngf-multiple=\"multiple\">Select File</div>\n" +
  11. " Drop File:\n" +
  12. " <div ngf-drop ngf-select ng-model=\"files\" class=\"drop-Box\" \n" +
  13. " ngf-drag-over-class=\"dragover\" ngf-multiple=\"true\" ngf-allow-dir=\"true\"\n" +
  14. " accept=\"image/*,application/pdf\">Drop pdfs or images here or click to upload</div>\n" +
  15. " <div ngf-no-file-drop>File Drag/Drop is not supported for this browser</div>\n" +
  16. " Image thumbnail: <img ngf-src=\"files[0]\">\n" +
  17. " Files:\n" +
  18. " <ul>\n" +
  19. " <li ng-repeat=\"f in files\" style=\"font:smaller\">{{f.name}}</li>\n" +
  20. " </ul>\n" +
  21. " Upload Log:\n" +
  22. " <pre>{{log}}</pre>\n" +
  23. "<md-action><div class=\"button\" ng-click=\"close()\">close!</div></md-action>\n" +
  24. "<md-action><div class=\"button\" ng-click=\"upload()\">upload!</div></md-action>\n" +
  25. "</md-dialog-content>\n" +
  26. "</md-dialog>";
  27. $scope.files = ['files should appear here','files 1','file2'];
  28. $scope.openDialog = function () {
  29. $mdDialog.show({
  30. parent: angular.element(document.body),template: tmpl,controller: 'myCtrl'
  31. });
  32. };
  33. $scope.close = function() {
  34. $mdDialog.hide();
  35. };
  36. $scope.$watch('files',function () {
  37. $scope.upload($scope.files);
  38. });
  39. $scope.upload = function (files) {
  40. if (files && files.length) {
  41. for (var i = 0; i < files.length; i++) {
  42. var file = files[i];
  43. Upload.upload({
  44. url: 'upload/url',fields: {'username': $scope.username},file: file
  45. }).progress(function (evt) {
  46. var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
  47. console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
  48. }).success(function (data,status,headers,config) {
  49. console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
  50. });
  51. }
  52. }
  53. };
  54. }]);

顺便说一句:作为看家记录,我经常听到不应该将应用程序逻辑传递给控制器​​.在这种情况下,如果将$scope.upload引入工厂,它将如何引用$scope并且$scope在工厂中不可用?

谢谢您的帮助.

Plnkr:http://plnkr.co/edit/e2MYdEABhj34ahtPTO0g?p=preview

解决方法

您可以将控制器的$scope传递给$mdDialog,如下例所示
  1. $mdDialog.show({
  2. parent: angular.element(document.body),scope: $scope,controller: 'myCtrl'
  3. });

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

要将应用程序逻辑移到工厂,您将执行类似的操作

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

和工厂将有方法

  1. factory.upload = function(files,username)
  2. {
  3. function (files) {
  4. if (files && files.length) {
  5. for (var i = 0; i < files.length; i++) {
  6. var file = files[i];
  7. Upload.upload({
  8. url: 'upload/url',fields: {'username': username},file: file
  9. }).progress(function (evt) {
  10. var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
  11. console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
  12. }).success(function (data,config) {
  13. console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
  14. });
  15. }
  16. }
  17. };

猜你在找的JavaScript相关文章