AngularJS - 在两个控制器之间共享数据的正确方法

时间:2015-06-29 10:09:34

标签: javascript angularjs

我想了解如何在AngularJS中的两个或多个控制器之间共享一些数据。

现在我只是处理两个控制器,但将来我会有更多的控制器也想要使用这些相同的数据。现在我有navigation-controller来控制side navigationheader。为了便于理解,我们假设第二个控制器被称为content-controller,它负责处理所有内容。

我希望根据用户搜索的内容动态加载内容,并且搜索栏位于侧面导航中,因此两个控制器都需要访问此searchTerm。在将来,我还将实现一些其他可能需要访问此searchTerm的功能。

就HTML结构而言,content-controller位于navigation-controller

我的第一个想法是通过将searchTerm添加到$rootScope来使全局可用,但我不确定这是否是一种有效/安全的方法。

我的第二个想法是采取搜索方面并将它们放入service。在这个服务中,我会放置与API对话的函数,以获得必要的数据。这意味着在搜索栏上,我可以让submit search按钮访问service并运行类似FooService.update(searchTerm)的内容。

您认为处理这种情况的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

控制器之间共享数据一直是一项突出的要求。你有几个选择:

  1. 工厂
  2. 服务
  3. 您可以参考this回答,了解有关差异的详细信息。

    使用服务绝对是更好的选择,因为你不会使用额外的变量来污染根范围[这些数量注定会像你们已经提到的那样增长]。

    将数据存储在服务中并在控制器和HTML中轻松访问它们的可能方法可以描述为:

    1. 创建一个包含所有模型变量的服务。

      angular.service("dataService", function() {
      
          this.value1 = "";
          this.value2 = "";
      });
      
    2. 在控制器中引用该服务,将其引用保存在范围内。

      angular.controller("myCntrl1", function($scope, dataService) {
          $scope.dataService = dataService;
      });
      
      
      angular.controller("myCntrl2", function($scope, dataService) {
          $scope.dataService = dataService;
      });
      
    3. 现在在你的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()
            }
        }

    }
相关问题