在不同元素上使用相同的控制器来引用同一个对象

时间:2013-01-22 07:02:05

标签: angularjs

我想如果我在我的DOM中的多个元素上打了ng-controller="GeneralInfoCtrl"他们将共享相同的$scope(或者至少双向绑定不起作用)。

我想这样做的原因是因为我在HTML的不同部分有不同的只读视图和相关的模态对话框,并且它们不共享共同的祖先(除了<body>和{{ 1}})。

有没有办法让两个控制器引用相同的对象/ make数据绑定在它们之间工作?


以下是那些坚持看到标记的代码, Jade 编写:

<html>

我的控制员:

   .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')
...

2 个答案:

答案 0 :(得分:76)

每次Angular编译器在HTML中找到ng-controller时,都会创建一个新范围。 (如果使用ng-view,则每次转到不同的路径时,也会创建新的范围。)

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

function GeneralInfoCtrl($scope, MyService) {

然后,每个范围/控制器实例都可以访问共享数据。

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

这是一个fiddle(我没写过),展示了两个控制器如何共享数据。

另请参阅AngularJS: How can I pass variables between controllers?
Angularjs: two way data bindings and controller reload

答案 1 :(得分:13)

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