Angular.js来自另一个控制器的回调

时间:2017-10-17 08:54:47

标签: javascript angularjs

在我的角项目中,我正在使用Angular.js material。我希望使用自定义控制器显示$mdialog,其中用户更改了一些数据,这些数据应该应用于我的$scope变量。我现在做的例子:

function myControllerFn($scope, MyService){
   // I do copy of my service variable because I don't want to change it until user will click save button
   $scope.name = angular.copy(MyService.name); 

   $scope.editCurrentProfile = function() {
       $scope.showEditProfileDialog($scope.name).then(function(name){
                    $scope.name = name;
       }
   }

   $scope.showEditProfileDialog = function(name) {
      var deferred = $q.defer();
      $mdDialog.show({
         controller: 'editProfileViewCtrl',
         templateUrl: 'controllers/editProfileDialog.tmpl.html',
         locals: {
             name: name,
             deferred: deferred
         }
      });
         return deferred.promise;
     };
}

然后在对话框控制器中我做:

function editProfileViewCtrl($scope, name, deffered) {
    deferred.resolve('newName');
}

但我认为这是错误的方式。那么在没有新服务的情况下,在两个视角控制器之间进行通信的最佳方式是什么?或者更好地创建另一项服务,例如:EditDialogService,我将在哪里保存结果?

3 个答案:

答案 0 :(得分:3)

当您打开模态时,show()函数会返回一个承诺。

$scope.showEditProfileDialog = function(name) {
  var modalInstance = $mdDialog.show({
     controller: 'editProfileViewCtrl',
     templateUrl: 'controllers/editProfileDialog.tmpl.html',
     locals: {
         name: name
     }
  });

   modalInstance.then(function(result){
      // acces what is returned
      // In your case, you would do
      $scope.name = result;
   }, function(error){
      // Usually when you cancel your modal
   });
 }

您的模态控制器可以注入$mdDialog

function editProfileViewCtrl($scope, name, $mdDialog) {
    $scope.close = function() {
        $mdDialog.hide('newName');
    }
}

答案 1 :(得分:-1)

您应该使用您的用户创建一个指令作为范围变量。 Angular本身就是处理数据绑定。

答案 2 :(得分:-1)

可以创建一个可以访问$ scope的最小控制器函数。

$mdDialog.show({
  controller: function () { this.parent = $scope; },
  templateUrl: 'controllers/editProfileDialog.tmpl.html',
  locals: {
     name: name,
     deferred: deferred
  }
});