在 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 中的控制器之间共享变量的主要内容,如果未能解决你的问题,请参考以下文章