Angularjs:如何从模态控制器和指令控制器访问主控制器
Angularjs: How to access main controller from modal controller and directive controller
我是Angularjs的新手,正在做一个宠物项目。我有一个主页,它在HomeController
中有一些功能。然后我在主页中有一个按钮,点击后打开一个模态,该模态有一个单独的控制器,名为ModalController
。还有一个指令存在于具有自己控制器的模态中。我还有另外三个地方需要使用日期选择器,所以我创建了一个日期选择器指令,并在所有三个地方都使用它。
我无法执行以下功能。
- 单击
edit
,我打开了一个对话框,但我需要用行数据打开它,当按下保存时,应该会更新行。(我在这里面临的问题是如何获得指令的控制器日期的值。) - 打开Modal并输入详细信息,然后单击保存。我需要创建一个新记录,并将其添加到主控制器中的记录中。(如何将数据从模态控制器保存到主控制器记录。)
script.js
angular.module('myApp', ['ngAnimate', 'ui.bootstrap']);
angular.module('myApp').controller('HomeController', function($scope, $uibModal) {
$scope.records = [{'date': new Date(), 'place': 'Bangalore'}];
$scope.openModal = function() {
$uibModal.open({
templateUrl: 'modaldialog.html',
controller: 'ModalController'
});
};
// How to get the directive date-picker value and pass it and save it.
$scope.edit = function(record) {
$uibModal.open({
templateUrl: 'modaldialog.html',
controller: 'ModalController'
});
};
$scope.addwithinCtrl = function() {
var record = {'date': new Date(), 'place': 'Hyderabad'};
$scope.records.push(record);
};
});
angular.module('myApp').controller('ModalController', function($scope, $uibModalInstance) {
// save the input and dismiss the dialog
$scope.save = function() {
// how to save the entered data before closing the dialog?
$uibModalInstance.dismiss('cancel');
};
$scope.cancel = function() {
$uibModalInstance.dismiss('cancel');
};
});
angular.module('myApp').directive('dateDirective', function() {
return {
restrict: 'A',
templateUrl: 'date.html',
controller: function($scope) {
$scope.format = 'dd-MMM-yy';
$scope.open = function() {
$scope.status.opened = true;
};
$scope.status = {
opened: false
};
}
}
});
Plunker:Plunker
要完成任务,还需要执行多个步骤。我将为您提供一个良好的开端,介绍如何在模式控制器之间传递数据,以及如何设置正确的日期到日期选择器。
首先,确保隔离日期选择器的范围,这将使您的生活在未来变得更简单。然后将必要的模型传递到该指令中,并将其绑定到日期选择器(在日期选择器模板ng-model="model"
中):
angular.module('myApp').directive('dateDirective', function() {
return {
scope: {
model: '=ngModel'
},
// ... rest of code is unchanged
}
});
然后您需要将记录对象传递到模式控制器中。为此,您将使用模态的解析指令:
$scope.edit = function(record) {
$uibModal.open({
resolve: {
record: record
},
templateUrl: 'modaldialog.html',
controller: 'ModalController'
});
};
在HTML中,您需要将record
传递给edit
函数:
<button class="btn btn-primary" type="button" ng-click="edit(record)">edit</button>
最后,为了更新原始记录,您需要订阅$uibModal.open
方法返回的已解析承诺:
.controller('ModalController', function($scope, $uibModalInstance, record) {
$scope.record = angular.copy(record);
$uibModalInstance.result.then(function() {
angular.extend(record, $scope.record);
});
// ...
});
注意,在模态控制器中,您需要制作原始记录的副本,并在模态模板中使用它。这是必要的,因为您只想在按下"保存"时影响原始记录,然后用更改的数据扩展原始模型。
演示:http://plnkr.co/edit/Hq0wFilQpZ26Ha2nyNxN?p=info
从控制器外部添加新记录
至于你的第二个问题,这是另一个有趣的问题。由于在原始代码中,您将记录存储在scope数组中,因此这实际上并不是添加新记录的非常方便的设计解决方案。在现实世界中,您可能有一个单独的模型层负责获取现有记录和创建新记录。在Angular中,您可以为此使用服务。因此,您需要使用获取、更新和保存记录的方法注册一个新的服务对象。就MVC而言,它将对应于M层。然后,每当您想从任何控制器添加新记录时,您都会使用该服务,该服务在每个控制器中都是相同的单例对象。
在您的案例中,这里有一个非常简单的服务示例:
angular.module('myApp').service('records', function() {
this.data = [{
'date': new Date(),
'place': 'Bangalore'
}];
this.fetch = function() {
return this.data;
};
this.save = function(record) {
this.data.push(record);
};
});
最后,这里是您的问题的完整示例,它可以使用服务从控制器和外部保存新记录,还允许编辑。
演示:http://plnkr.co/edit/NxP0HJurZuLA7odzzdie?p=preview
- 在指令控制器中使用$attrs时出现问题
- Angular,从指令控制器中的控制器触发函数
- 角度指令控制器:参数不是函数,未定义
- 如何将值传递到角度中的指令控制器
- angularjs+ui.router:指令控制器和链接函数之间的不同行为
- AngularJS中的控制器/指令继承
- 如何使用角度指令控制器动态单击复选框
- 如何从父指令/控制器访问指令范围
- 角度指令 - 需要从指令控制器访问所需的控制器
- 指令链接中的范围变量不会更新到指令控制器使用 Angular 读取它时
- 在同一元素上使用“控制器作为 x”的多个 ng 控制器指令
- 从链接函数修改指令控制器变量
- 监视指令控制器不工作
- Angular js 指令控制器访问范围属性,但返回未定义
- 指令控制器和普通控制器之间的区别
- 角度指令链接函数中的范围是否与角度指令控制器中的$scope相同
- AngularJS :如何从相同的指令控制器访问指令范围
- 角度“这个”在指令控制器内不起作用
- 列出 AngularJS 模块中声明的指令/控制器
- 角度指令控制器单元测试使用窗口.确认