在 angular.js 中的控制器之间共享变量

Posted

技术标签:

【中文标题】在 angular.js 中的控制器之间共享变量【英文标题】:Sharing a variable between controllers in angular.js 【发布时间】:2013-05-06 16:43:24 【问题描述】:

我是 Angular 的新手,我想知道如何在 Angular 控制器之间共享一个变量。我正在使用以下脚本 -

在 Main.js 中:

function MainCntl($scope) 
  ---code


function SearchCtrl($scope, $http) 
    $scope.url = 'http://10.0.0.13:9000/processAdHoc';
    $scope.errorM = "No results";     
    $scope.search = function() 

        $http.post($scope.url,  "data" : $scope.keywords).
        success(function(data, status) 
            $scope.status = status;
            $scope.data = data;
            $scope.result = data; 
            alert('yes');
        )
        .
        error(function(data, status) 
            $scope.data = data || "Request failed";
            $scope.status = status;   
            alert('no');
            $scope.result = "failed";
        );
    ;

在 Index.html

<body ng-controller="MainCntl" >
---code
<div ng-controller="SearchCtrl">
     <form class="well form-search">
     <div class="ui-widget">
          <label for="tags"></label>
          <a ng-click="search()"><input type="image" src="../../images/search1.png" class="searchbox_submit" /></a>
          <input ng-model="keywords" placeholder="Shadow Search" id="tags" class="input-medium search-query rounded" /> 
     </div>
     </form>
</div>
---code
<p ng-model="result">
     result
</p>
</body>

我正在发送数据并接收响应的 ajax 一切正常,我的问题如下:

在 SearchCtrl 函数中,我有一个名为 $scope.result 的变量,稍后在 Index.html 中引用它。如果我将包含该变量的 html 代码插入到 SearchCtrl 控制器中,它可以正常工作,但如果它在 MainCtrl 控制器中,则它不起作用。如何在控制器之间共享此变量。

先谢谢了

【问题讨论】:

【参考方案1】:

使用服务并将其注入两个控制器,并将您的范围变量引用到服务变量。

例子:

angular.module("yourAppName", []).factory("myService", function()

  return sharedObject: data: null  

);

function MainCtrl($scope, myService) 
  $scope.myVar = myService.sharedObject;


function SearchCtrl($scope, $http, myService) 
  $scope.myVar = myService.sharedObject;

在你的模板中做:

myVar.data

See an example 使用 Angular v1.1.5

您将其放入内部对象的原因是为了保留您的引用,如果您在没有“sharedObject”的情况下保留它并更改该对象,您的绑定将指向旧引用并且不会显示任何内容模板。

【讨论】:

嗨 ShaiRez,感谢您的快速回答和示例,但遗憾的是它仍然无法正常工作......也许我没有正确实施它。我添加了您在示例中提供的所有内容,并将模板更改为 myVar.data。出现了两个问题,我不应该也更改模板视图,并将 myVar 添加到 ajax 调用的成功/错误函数中吗?再次感谢,吉顿 在阅读了更多内容之后,我发现了一种使用 $rootScope 更简单的方法......无论如何,感谢您的时间和对 angular 聚会的赞誉,我将尝试制作下一个 :) @ShaiRez 是处理身份验证的首选模型?在服务中进行身份验证(如果尚未登录)并将用户模型返回给所有需要它的控制器? 这是一个不同的问题,如果我理解正确,请使用登录服务或用户服务来保存此类通信或属性 @Gidon 我编辑了答案,请参阅 jsbin 上添加的示例。另外,ShaiRez 的代码也有错误。

以上是关于在 angular.js 中的控制器之间共享变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 watchOS 上基于分页的界面中的多个界面控制器之间共享变量

在烧瓶中的路线和主要之间使用共享变量

java中的volatile变量

angular.js_$scope

如何在不同文件中的史诗之间共享变量?

是否可以在 Vuex(Nuxt) 中的 SASS 和 Javascript 之间共享变量?