Angularjs (如何)当控制器的视图不可见时,控制器可以处于活动状态?

Angularjs (如何)当控制器的视图不可见时,控制器可以处于活动状态?,angularjs,Angularjs,如果我理解正确,当控制器的视图处于活动状态时,会生成控制器吗 这意味着如果视图不可见,控制器不存在/不处于活动状态 有没有办法让控制器“在后台”处于活动状态 我有一个应用程序,它有两个主要标签,一个用于车辆跟踪,另一个用于其他东西。每个选项卡都有几个子选项卡(使用UI路由器);在车辆跟踪方面,我有一个用于谷歌地图的选项卡,另一个用于显示带有街道地址的网格 下面是我试图在Angular中重新实现的桌面应用程序的图片: 现在,我是一个有棱角的初学者,所以我的设计想法可能有缺陷,但是: 地图和车辆

如果我理解正确,当控制器的视图处于活动状态时,会生成控制器吗

这意味着如果视图不可见,控制器不存在/不处于活动状态

有没有办法让控制器“在后台”处于活动状态


我有一个应用程序,它有两个主要标签,一个用于车辆跟踪,另一个用于其他东西。每个选项卡都有几个子选项卡(使用UI路由器);在车辆跟踪方面,我有一个用于谷歌地图的选项卡,另一个用于显示带有街道地址的网格

下面是我试图在Angular中重新实现的桌面应用程序的图片:

现在,我是一个有棱角的初学者,所以我的设计想法可能有缺陷,但是:

地图和车辆位置选项卡都使用从服务器中提取的相同数据,即GPS lat/long和timestamp列表

在我看来,让每个选项卡(控制器)获取相同的数据、复制代码是错误的

因此,我想为“车辆位置”选项卡提供一个控制器,它将获取数据并将其提供给一个服务,两个地图/车辆位置子选项卡(控制器)可以
$watch

即使我不是在看“父视图”(“车辆位置”),而是在看另一个(“车辆报告”或“员工报告”),我也会继续下载此数据并更新视图,以便在用户单击“车辆位置”时选项卡中,信息已经存在&用户不必等待应用程序转到服务器获取数据和绘制视图


问题:Angular可以这样工作吗,或者我是在要求它做一些非Angular ish的事情吗?如果是这样,实现这一点的正确方法是什么?我应该复制
$http.get
代码吗?我应该让控制器在
$scope.$on上获取和更新自己的数据吗(‘$VIEW CITCONTROUND’< /CODE >?

< P>)您可以考虑一些应用程序:

  • 您可以为要共享和重用的数据创建一个工厂。因此,您可以创建一个http工厂,从服务器获取数据,然后将其注入到需要的任何控制器。此外,您还可以使用angularjs(routes中的一个选项)中的“resolved”解析传入数据,以确保在页面呈现之前数据可用
  • 如果您正在将控制器内的数据传递给http.get,那么就注入工厂并使用http方法

  • <> P>有一些观点你可以考虑这个应用程序:

  • 您可以为要共享和重用的数据创建一个工厂。因此,您可以创建一个http工厂,从服务器获取数据,然后将其注入到需要的任何控制器。此外,您还可以使用angularjs(routes中的一个选项)中的“resolved”解析传入数据,以确保在页面呈现之前数据可用
  • 如果您正在将控制器内的数据传递给http.get,那么就注入工厂并使用http方法

  • 如果您需要AngularJS应用程序中数据的中心访问点,最好的方法是将其封装在
    提供商
    (或者是
    服务
    或者
    工厂
    )。获取提供程序中的数据并实现getter,以便可以将其插入控制器并请求数据,而无需重复代码和请求

    yourApp.service('serviceName', [ '$http',
        function($http) {
    
            this.getData = function() {
                return $http.get(...);
            } 
        }
    ]);
    
    yourApp.controller('controllerA', ['serviceName', 
        function(serviceName) {
            serviceName.getData().then(function(data){
                $scope.data = data;
            });
        }
    ]);
    
    //the same for other controllers
    

    如果您需要AngularJS应用程序中数据的中心访问点,最好的方法是将其封装在
    提供商
    (或者是
    服务
    或者
    工厂
    )。获取提供程序中的数据并实现getter,以便可以将其插入控制器并请求数据,而无需重复代码和请求

    yourApp.service('serviceName', [ '$http',
        function($http) {
    
            this.getData = function() {
                return $http.get(...);
            } 
        }
    ]);
    
    yourApp.controller('controllerA', ['serviceName', 
        function(serviceName) {
            serviceName.getData().then(function(data){
                $scope.data = data;
            });
        }
    ]);
    
    //the same for other controllers
    

    +1啊,我明白了!谢谢。我的错误是把
    $http.get
    放在一个控制器中。我应该把它放在一个服务中(看起来比工厂简单,但我还在学习。该服务定期获取数据并存储它。然后我可以使用
    $scope.$on(“$viewContentLoaded”
    调用服务的getter来更新数据(moel)在我的控制者/观点中。这是正确的吗?
    服务
    工厂
    的唯一区别在于对它们的思考方式,因为它们实际上是隐藏的
    提供者。我更喜欢使用服务来单点访问数据,比如您的案例。关于您评论的第二部分,如果您获取的数据由于服务是一个对象/数组,它将通过引用分配给范围变量,因此视图将自动更新。只需考虑更新模型。+1谢谢。我将实现此功能并尽快与您联系+1啊,我明白了!谢谢。我的错误是将
    $http.get
    放在控制器中。我应该将其放在服务中(看起来比工厂简单,但我仍在学习。服务定期获取数据并存储数据。然后我可以使用
    $scope.$on(“$viewContentLoaded”
    调用服务的getter来更新数据(moel)在我的控制者/观点中。这是正确的吗?
    服务
    工厂
    的唯一区别在于对它们的思考方式,因为它们实际上是隐藏的
    提供者。我更喜欢使用服务来单点访问数据,比如您的案例。关于您评论的第二部分,如果您获取的数据由于服务是一个对象/数组,它将通过引用分配给范围变量,因此视图将自动更新。只需考虑更新模型。+1谢谢。我将实现此功能并尽快与您联系+1谢谢。我对Angular是新手。当您谈到“已解决”时,这与承诺和
    https://docs.angularjs.org/api/ng/service/$q
    ?+1谢谢。我对Angular是新手。当你谈到“已解决”时,这是不是与承诺和
    https://docs.angularjs.org/api/ng/service/$q