在同一控制器的不同实例之间共享数据(ng-controller)

时间:2016-02-01 08:38:05

标签: javascript angularjs

我是棱角分明的新手,我正在努力完成一项非常简单的任务,角度似乎并不那么简单。

我有一些数据(为了简单起见,只是一个名为 var1 的变量),我正在网页的一个区域修改,而我想在网页的另一个区域显示它。 / p>

<body ng-app="app">
    <div id="div1" ng-controller="TestCtrl">
        <input type="text" ng-model="var1" /> Var1: {{ var1}}
    </div>
    <br />
    <div id="div2" ng-controller="TestCtrl">
        Var1: {{ var1 }}
    </div>

 //..

我正在相应的控制器中初始化变量:

 angular.module('app', [])
    .controller('TestCtrl', function($rootScope){
        $rootScope.var1 = 1;
        $rootScope.var2 = 2;

        this.updateValues = function() {
            srv.updateValues($rootScope.var1, $rootScope.var2);
        };

    });

现在,您可能知道,第二次将ng-controller附加到div时,我得到一个全新的控制器实例,它对我实际修改数据的第一个实例一无所知。

那么如何在网页的另一个区域访问第一个控制器的var1

https://plnkr.co/edit/XgIWFW89tavnjOW09TBp?p=preview

  • 我想到的一件事就是将TestCtrl附加到身体上,这样基本上整个网站只有TestCtrl的一个实例。这是一种常见的方法吗?我已经感觉到90%的控制器都会贴在身体标签上。

  • 我已经阅读了使用服务的建议,说实话,我真的没有看到如何为这样一个简单的场景实现这样的服务。

  • 还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

好的,这与Miško的说法有关:

  

“..如果你使用ng-model,必须在某个地方有一个点。如果你没有   有一个点,你做错了..“

简而言之,当您在第二个控制器中初始化var1时,您正在创建自己的范围(即使您使用$rootScope时)。

而不是直接访问$rootScope

$rootScop.var1 = 1;

尝试使用对象:

$rootScope.dataObj = {var1: 1};

https://plnkr.co/edit/oVB16H0PBLFx3PyLhuRN?p=preview

进一步阅读:

Why don't the AngularJS docs use a dot in the model directive?

http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html

https://thinkster.io/egghead/the-dot