Javascript Angular服务在属性更改时使用$watch执行$http调用

Javascript Angular服务在属性更改时使用$watch执行$http调用,javascript,angularjs,Javascript,Angularjs,我是个新手,不知道最好的处理方法是什么。我的应用程序是由一个跟踪应用程序状态和当前加载数据的服务构成的。我将其注入我的所有控制器中,以便与它们共享应用程序状态,并且还可以通过使用该服务在控制器之间进行更改。服务概述如下: app.factory('AppStateService', function() { return { selected_section: "blog", data_of_selected_section: {here_comes_data_from_an

我是个新手,不知道最好的处理方法是什么。我的应用程序是由一个跟踪应用程序状态和当前加载数据的服务构成的。我将其注入我的所有控制器中,以便与它们共享应用程序状态,并且还可以通过使用该服务在控制器之间进行更改。服务概述如下:

app.factory('AppStateService', function() {
  return {
    selected_section: "blog",
    data_of_selected_section: {here_comes_data_from_an_api}
  }
}
如前所述,我将其注入所有控制器,并将其绑定到控制器作用域,以便它们都可以更改这些属性,这一点非常有效。然而,我真的希望该服务在某些属性发生更改时自动对API执行$http调用。当数据从API返回时,我希望将此数据分配给属性,以便控制器可以基于此数据进行更新

例如,在上面的示例中,如果控制器将
selected_节
从例如“blog”更改为“main”,我希望服务执行$http调用,并将返回的数据放入
data_of_selected_节
,以使其传播到控制器。当然,我可以直接从控制器执行此操作,并从那里将结果推送到服务,但随后我必须在每个控制器中复制该代码。因此,我更希望服务能够自己完成

最好的方法是什么?我想我必须在服务中的某个地方建立一个
$watch
$watchCollection
,但我很难准确地思考如何做到这一点。特别是因为我可以很容易地想象,如果做得不对,可能会破坏性能


另一方面,我之所以想这样做,是因为我正在进行数据可视化,因此主要是我的界面,而不是我的数据将发生变化。因此,我真的很想在服务中“全局”存储我的数据和应用程序状态。我不知道这是否有意义。任何帮助都将不胜感激

您可以使用
.run
,因为此方法将在每次路由更改时实例化服务

app.run(function ($rootScope, AppStateService) {
    $rootScope.$on('$routeChangeStart', function () {
       $rootScope.data = AppStateService.data_of_selected_section
    });
});

您可以在服务内部编写
http
调用,因为只要路由发生更改,就会自动调用
您可以使用
。运行
,因为此方法将在每次路由更改时实例化服务

app.run(function ($rootScope, AppStateService) {
    $rootScope.$on('$routeChangeStart', function () {
       $rootScope.data = AppStateService.data_of_selected_section
    });
});

您可以在服务内部编写
http
调用,因为只要路由发生更改,就会自动调用该调用

,为什么不简单地使用一种方法来更改所选的_部分值并执行http调用呢?听起来您试图在控制器中存储太多,而不是利用物体。如果将状态对象存储在服务中,则每当控制器等于该服务对象时,它将仅为引用,因此,在任何一个位置进行更改都会使两个位置相同,并允许在任意数量的控制器或方向上共享相同的数据。为什么不简单地使用一种方法来更改所选的_节值并执行http调用?听起来好像您试图在控制器中存储太多,而没有利用对象的典型继承。如果将状态对象存储在服务中,每当控制器与该服务对象相等时,它将只是一个引用,因此在任一位置进行更改将使两个位置相同,并允许在任意数量的控制器或指令上共享相同的数据