AngularJS-在控制器之间共享信息,或改变架构,使其不必

AngularJS-在控制器之间共享信息,或改变架构,使其不必,angularjs,Angularjs,我正在学习angular,并试图通过编写应用程序来做到这一点 我希望一个页面显示为这样(未经测试的html,因为我正在了解架构): Course.html: <div ng-controller='courseController as course' > {{course.name}} <form> <input type='text' ng-model='course.desscription' /> </fo

我正在学习angular,并试图通过编写应用程序来做到这一点

我希望一个页面显示为这样(未经测试的html,因为我正在了解架构):

Course.html:

<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-我试图(无论多么糟糕)回答编辑标题下的“它怎么样了?”