AngularJS-在控制器之间共享信息,或改变架构,使其不必
我正在学习angular,并试图通过编写应用程序来做到这一点 我希望一个页面显示为这样(未经测试的html,因为我正在了解架构): Course.html:AngularJS-在控制器之间共享信息,或改变架构,使其不必,angularjs,Angularjs,我正在学习angular,并试图通过编写应用程序来做到这一点 我希望一个页面显示为这样(未经测试的html,因为我正在了解架构): Course.html: <div ng-controller='courseController as course' > {{course.name}} <form> <input type='text' ng-model='course.desscription' /> </fo
<div ng-controller='courseController as course' >
{{course.name}}
<form>
<input type='text' ng-model='course.desscription' />
</form>
Teachers:
<div ng-include="'People.html'" ng-model="course.teachers as people"></div>
Students:
<div ng-include="'People.html'" ng-model="course.students as people"></div>
</div>
{{course.name}
教师:
学生:
People.html:
<button type="button" ng-click="addParticipant()">Add new {{people.personType}}</button>
<table>
<tbody>
<tr ng-repeat="person in people track by person.Id">
<td>{{person.FirstName + ' ' + person.LastName}}</td>
<td><button type="button" ng-click="editParticipant()">edit</button></td>
...
</table>
<script type="text/ng-template" id="personModal.html">
<div class="modal-title">{{operationDescription}}</div>
<div class="modal-body">
<div ng-view="'Person.html'">
</div>
</script>
添加新的{{people.personType}
{{person.FirstName+''+person.LastName}
编辑
...
{{operationDescription}}
addParticipant()和editParticipant()将以模式显示。personType是“教师”或“学生”之一。操作说明是“添加/编辑教师/学生”之一
Person.html:
<form ng-controller='personController as person'>
<fieldset><legend></legend>
FirstName:
<input ng-model="person.FirstName" />
<button class="btn btn-primary" type="button" ng-click="ok()">OK</button>
名字:
好啊
[请随意评论上述架构或HTML的问题]
如何实现控制器之间的信息交换(注意,这是通过模式而不是路由实现的)
personController需要有权访问persons id(如果是数字,它将从personFactory方法获取记录,否则它将创建新记录)。成功创建人员后,适当的数组(代表教师或学生)需要添加一个带有新人员姓名和Id的项目,并关闭模式。我将如何实现这一点
我能找到的教学例子是,网络要么只有一个控制器,要么使用路由。单控制器解决方案似乎是错误的,因为它缺乏关注点的分离和可重用性(人们可以设想希望从应用程序中的其他页面创建一个新人,并且还可能在模式之外显示表单)
如果我有不合适的架构,还有哪些其他方法
编辑
作为对George Stocker的回应,这是一个学习者和业余爱好者提出的关于架构和使用模式的问题。鉴于上述使用案例,工厂方法真的是实现这一点的方法吗?到目前为止,在我的学习中,我已经将工厂方法限制在与数据存储交互的问题上——离开这种模式不会混淆体系结构吗?在WPF MVVM中,这是我之前最接近Angular的,父viewmodel将实例化子viewmodel,注入上下文并设置适当的变量,然后观察这个新viewmodel对象上的适当属性,而不通过任何服务层传递数据-非常整洁,但这不符合我正在学习/了解的角度体系结构(与您所链接的答案相当的答案在WPF中通常被认为是不好的做法)。我环顾四周,查看了角度控制器之间的数据传递,但我突然想到应该避免这种情况。看了答案和评论后,我开始相信,使用工厂或服务方法在控制器之间传递数据确实是一种好方法
谢谢创建共享数据的服务 在angular中查看服务以共享数据。服务就像angular内部的“全局名称空间”。它们可以存储/拉取数据,并且可以注入多个控制器以共享数据。这里有一个快速的例子 如果它很小,可以改用rootScope 而且,它是一件小事(比如用户名),将其作为属性存储在$rootScope上。各种控制器中的所有作用域都继承自rootScope。如果将其注入控制器,则可以访问它
var myApp = angular.module('myApp');
myApp.controller('first', ['$scope', '$rootScope', function($scope, $rootScope) {
$rootScope.userName = 'name';
}]);
模式问题
根据您用于创建模态div的内容,您可能会从父控制器中创建这些模态对话框
如果您使用的是类似的框架,那么很可能
(a) 将person对象作为resolve参数传递给模态窗体的控制器,然后
(b) 在.then()函数中将其传递回基本控制器,以便重新整合到数据集中
整个“打开/关闭模式”对话框都清楚地显示在中。当您有这样的嵌套元素时,内部元素可以访问外部元素。换句话说,由于
元素是嵌套的,因此它可以访问人员
以及人员
。当使用“controller as”语法时,这一点更加清楚;当使用$scope
时,您必须使用$parent
来查找父元素。您怎么能问这个问题,却找不到一个与此问题完全相同的评分很高的问题@GeorgeStocker-我试图(无论多么糟糕)回答编辑标题下的“它怎么样了?”