Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制器之间的角度共享数据:服务与事件_Javascript_Angularjs - Fatal编程技术网

Javascript 控制器之间的角度共享数据:服务与事件

Javascript 控制器之间的角度共享数据:服务与事件,javascript,angularjs,Javascript,Angularjs,在控制器之间共享数据是否有一般的经验法则 对于如何实现这一点,我看到了两种类型的答案: 将服务注入将包含共享数据的两个控制器 使用$scope.$broadcast('someEvent',sharedArg)和$scope.$on('someEvent',sharedArg) 我不确定什么时候最好使用一种方法而不是另一种 此外,有一件事我真的不喜欢这种方法#1。下面是一个来自真实代码的玩具示例: angular.module('profileService', []) .fact

在控制器之间共享数据是否有一般的经验法则

对于如何实现这一点,我看到了两种类型的答案:

  • 将服务注入将包含共享数据的两个控制器
  • 使用$scope.$broadcast('someEvent',sharedArg)和$scope.$on('someEvent',sharedArg)
  • 我不确定什么时候最好使用一种方法而不是另一种

    此外,有一件事我真的不喜欢这种方法#1。下面是一个来自真实代码的玩具示例:

    angular.module('profileService', [])
           .factory('profileService', 
      [  
        function() {
          var selectedProfile = { profileId: null };
    
          return {
            getProfile: function(profileId, callback) {
              // marshall ajax request into format server will know how to handle
              // ajax call to server
              // marshall ajax response into format UI (controller) will know how to handle
            },
    
            createProfile: function(callback) { ... // ajax call to server ... },
            updateProfile: function(callback) { ... // ajax call to server ... },
            deleteProfile: function(callback) { ... // ajax call to server ... },
    
            getSelectedProfile: function() {
              return selectedProfile.profileId;
            },
    
            setSelectedProfile: function(profileId) {
              selectedProfile.profileId = profileId;
            },
          };
        }
      ]);
    
    这似乎是拙劣的设计。该服务(与我们的大多数服务一样)用于翻译和向服务器发出请求。我们的大多数服务都是完全无状态的。为测试等注入模拟服务很简单

    但现在我们的服务突然出现了状态。这似乎是个坏主意

    另一种方法可能是构建一个服务,该服务仅用于在控制器之间共享数据(并且从不进行后端调用),但这也不是所有的诱人之处。它闻起来像是一个提供全局名称空间的服务,这看起来不像是一个伟大的设计

    只是想知道,有没有关于方法1和方法2的想法。在服务中包含状态不一定是件坏事吗?事件是共享状态的更好方法吗

    谢谢。

    建议使用服务共享状态:

    不要使用控制器来:

    • 跨控制器共享代码或状态-改用角度服务。

    使用服务共享数据/状态是可以的(webcam.isStreaming、socket.isConnected等),但“选择”之类的内容不属于profileService,例如,应该可以有多个选择

    事件不是为了共享状态,而是为了。。。事件。如“includeContentLoaded”、“webcamReady”、“socketMessage”等。 控制器可能未就绪(通过ng include异步加载)并错过事件

    方法3:你试过这个方法了吗?它是围绕各州组织的。
    您可以使用$stateParams或
    resolve
    传递所选配置文件。
    ngRoute也可以实现其中一些功能,但非常有限

    方法4:您可以使用
    $scope
    在父控制器和子控制器之间共享数据。
    优点/缺点是选择生存期与作用域相连接。
    这会产生一些耦合/复杂性,但不会比profileSelectionsService更复杂。
    如果父控制器写入$scope,而子控制器读取,则效果非常好。
    当两个控制器都想写入$scope时,这就变得很棘手了

    是的,我在文档中也看到了这一点,但这是一个非常模糊的声明。正如我提到的,服务通常是无状态的,并且有一个定义良好的目的,即对服务器进行编组/解编组以及请求和响应。现在我们要添加状态?似乎应该有更好的方法来实现这一点。我将研究方法3。我认为方法4行不通,因为需要共享数据的控制器是对等的,没有父/子关系。你关于事件不用于共享状态的观点是正确的。谢谢