在我的角项目中,我正在使用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
,我将在哪里保存结果?
答案 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
}
});