Angularjs 在不同元素上使用同一控制器引用同一对象

Angularjs 在不同元素上使用同一控制器引用同一对象,angularjs,Angularjs,我想如果我对DOM中的多个元素使用ng controller=“GeneralInfoCtrl”,它们将共享相同的$scope(或者至少双向绑定不起作用) 我之所以要这样做,是因为我在HTML的不同部分有不同的只读视图和关联的模态对话框,它们不共享一个共同的祖先(除了和) 是否有办法使两个控制器引用同一对象/使它们之间的数据绑定工作 下面是一些代码,供那些坚持要查看标记的人使用Jade: .client-box(ng-controller="GeneralInfoCtrl")

我想如果我对DOM中的多个元素使用
ng controller=“GeneralInfoCtrl”
,它们将共享相同的
$scope
(或者至少双向绑定不起作用)

我之所以要这样做,是因为我在HTML的不同部分有不同的只读视图和关联的模态对话框,它们不共享一个共同的祖先(除了

是否有办法使两个控制器引用同一对象/使它们之间的数据绑定工作


下面是一些代码,供那些坚持要查看标记的人使用Jade

   .client-box(ng-controller="GeneralInfoCtrl")
        .box-header
            .box-title
                h5 General Information
            .box-buttons
                button.btn.btn-small(data-target='#editGeneralInfo', data-toggle='modal', data-backdrop='static') <i class="icon-pencil"></i> Edit
        .box-body
            table.table.table-tight.table-key-value
                tr
                    th Name
                    td {{client.fullName()}}
                tr
                    th Also Known As
                    td {{client.aka}}
                tr
                    th Birth Date
                    td {{client.birthDate|date:'mediumDate'}}
    ...

#editGeneralInfo.modal.hide.fade(ng-controller="GeneralInfoCtrl")
    .modal-header
        button.close(type='button', data-dismiss='modal') &times;
        h3 Edit General Information
    .modal-body
        form.form-horizontal.form-condensed
            .control-group
                label.control-label First Name
                .controls
                    input(type='text', placeholder='First Name', ng-model='client.firstName')
            .control-group
                label.control-label Last Name
                .controls
                    input(type='text', placeholder='Last Name', ng-model='client.lastName')
            .control-group
                label.control-label Also Known As
                .controls
                    input(type='text', placeholder='AKA', ng-model='client.aka')
            .control-group
                label.control-label Birth Date
                .controls
                    input(type='text', placeholder='MM/DD/YYYY', ng-model='client.birthDate')
...

只要将共享数据放在根范围内,您就可以在任何地方使用它们。在Angular中,$rootScope是所有作用域的根,可在控制器中用于管理必须在所有模块中可见的数据。要使用它,只需将其注入控制器函数。有关详细说明,请参阅和。

每次Angular编译器在HTML中找到ng控制器时,都会创建一个新的作用域。(如果使用ng view,则每次转到不同的管线时,也会创建一个新范围。)

如果您需要在控制器之间共享数据,通常服务是您的最佳选择。将共享数据放入服务,并将服务注入控制器:

function GeneralInfoCtrl($scope) {
    $scope.client = {
        firstName: 'Charlie',
        lastName: 'Brown',
        birthDate: new Date(2009, 12, 15),
        ...
    }
}
function GeneralInfoCtrl($scope, MyService) {
然后,每个作用域/控制器实例将能够访问共享数据

请注意,服务是单例的,因此周围只有一个共享数据实例

这里有一个(我没有写)演示两个控制器如何共享数据


另请参见和

谢谢。在《开发人员指南》中找不到对
$rootScope
的提及,但它在API中。这真的是最好的方法吗?我不需要访问其他“模块”,就在这一个控制器内。另外,假设我确实希望在一个页面上有多个客户端,并且单击其中一个客户端旁边的某个“编辑”按钮将使用该客户端的控制器/作用域,而不是全局/共享的控制器/作用域。。。然后呢?也许我需要做更多的阅读…在同一页中,您可以有多个控制器,每个控制器都有各自的作用域。如果你不是偶尔需要共享数据,你应该考虑使用“服务”。请阅读中的“正确使用控制器”部分。