我想了解如何在AngularJS中的两个或多个控制器之间共享一些数据。
现在我只是处理两个控制器,但将来我会有更多的控制器也想要使用这些相同的数据。现在我有navigation-controller
来控制side navigation
和header
。为了便于理解,我们假设第二个控制器被称为content-controller
,它负责处理所有内容。
我希望根据用户搜索的内容动态加载内容,并且搜索栏位于侧面导航中,因此两个控制器都需要访问此searchTerm
。在将来,我还将实现一些其他可能需要访问此searchTerm的功能。
就HTML结构而言,content-controller
位于navigation-controller
。
我的第一个想法是通过将searchTerm
添加到$rootScope
来使全局可用,但我不确定这是否是一种有效/安全的方法。
我的第二个想法是采取搜索方面并将它们放入service
。在这个服务中,我会放置与API对话的函数,以获得必要的数据。这意味着在搜索栏上,我可以让submit search
按钮访问service
并运行类似FooService.update(searchTerm)
的内容。
您认为处理这种情况的最佳方法是什么?
答案 0 :(得分:5)
控制器之间共享数据一直是一项突出的要求。你有几个选择:
您可以参考this回答,了解有关差异的详细信息。
使用服务绝对是更好的选择,因为你不会使用额外的变量来污染根范围[这些数量注定会像你们已经提到的那样增长]。
将数据存储在服务中并在控制器和HTML中轻松访问它们的可能方法可以描述为:
创建一个包含所有模型变量的服务。
angular.service("dataService", function() {
this.value1 = "";
this.value2 = "";
});
在控制器中引用该服务,将其引用保存在范围内。
angular.controller("myCntrl1", function($scope, dataService) {
$scope.dataService = dataService;
});
angular.controller("myCntrl2", function($scope, dataService) {
$scope.dataService = dataService;
});
现在在你的html中,你使用服务引用引用所有的模态变量:
// Controller 1 view
<div ng-controller="myCntrl1">
<input type="text" ng-model="dataService.value1" />
</div>
// Controller 2 view
<div ng-controller="myCntrl2">
The value entered by user is {{dataService.value1}}
</div>
答案 1 :(得分:0)
首先,我不知道它是否适合你。
您可以使用本地存储。
通过使用它,可以在任何控制器中访问相同的数据
以下是一个如何为我工作的例子。
@IBAction func editing(_ sender: UITextField)
{
if sender == yourFirstTextField {
if sender.text?.characters.count == 1 {
yourNextTextField.becomeFirstResponder()
}
}
}