2017-10-17 70 views
0

在我的角度项目中,我使用Angular.js material。我想要显示$mdialog与自定义控制器,其中用户更改一些数据,这些数据应该适用于我的$scope变量。比如我现在做的事:Angular.js从另一个控制器回调

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

当您打开模式时,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'); 
    } 
} 
+0

怎么样错误(拒绝承诺)? – Arti

+1

啊,对不起。找到了 !可以使用$ mdDialog.hide()解决的承诺或使用$ mdDialog.cancel()拒绝的承诺。谢谢 – Arti

-1

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

-1

它可以创建一个具有访问$范围最小的控制器功能。

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