首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器之间的共享状态- angularjs

控制器之间的共享状态- angularjs
EN

Stack Overflow用户
提问于 2015-05-14 11:17:14
回答 3查看 854关注 0票数 3

关于控制器之间的共享状态。我很难从所有推荐的解决方案中找到正确的方法来做到这一点。我做了这个草图来说明我对此的基本想法,到目前为止,我使用了一家工厂。

有一个工厂myFactory,它包含一个共享变量sharedVar

控制器Ctrl1, Ctrl2, Ctrl3希望始终访问更新的版本。他们也可以叫updateViaHttp

  1. 这就是工厂的正确用途吗?(一般用于共享状态,特定于其他选项,如服务和提供者)
  2. 如果是这样的话,如何以一种适当的方式观察更改sharedVar?(通过引用对象、$watch、事件(广播、打开)、.)
  3. 是否有一个通用模式对对象、数组和原语很好地工作
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-14 11:28:28

  1. 你的基本想法是正确的,假设“工厂”是指“服务”--我知道,这有点让人困惑,因为服务是用工厂函数声明的。也就是说,这是一个重要的区别,这样您就可以更容易地找到文档,等等。
  2. 只需使用对象引用并小心角度观察深度 (我喜欢的方法)或显式注册$watch语句(仍然要注意监视深度),就可以观察更改。一般来说,我认为您不应该过度使用广播,因为它会使您的代码有点混乱。在这种情况下,它还会破坏服务的意义,这就是共享状态的来源。
  3. 创建服务的一般模式是将我想要使用的所有东西绑定到对象(数据和函数),然后在工厂函数中返回该对象。有时,您必须引入一些额外的嵌套,以便Javascript原型继承不会给您带来麻烦(请再次查看监视深度),但这是一般的想法。

设置的示例服务:

代码语言:javascript
复制
angular.factory('shareAndUpdate', ['dependencyInjection', function(dependency) {
    var srvc = {};
    srvc.sharedVar = 'something';
    srvc.updateViaHttp = function(){ something };
    return srvc;
}]);
票数 1
EN

Stack Overflow用户

发布于 2015-05-14 11:28:08

您可能在寻找类似于公共服务的东西:

https://www.npmjs.com/package/angular-pubsub

然而,在我的经验中,通过适当的设计,您可以最小化在非嵌套控制器之间共享数据的必要性。

然而,有时候这是不可避免的,比如登录凭据、权限、包括所有应用程序的内容。在这种情况下,您可以使用服务在控制器之间共享/获取状态,也可以使用成熟的pubsub机制。

  1. 工厂只是另一种指定服务的方式。当调用工厂时,会给出服务的实例。这个服务可以用于任何您想要的东西,其中之一就是在控制器之间共享状态。
  2. 您可以通过多种方式查看共享变量,最简单的是继承作用域,但是,正如您提到的,有时控制器不一定继承它们的作用域。然后,您可以为两个控制器使用公共服务或仅在共享作用域上广播事件(比如$rootScope,它是应用程序所有控制器作用域的父级)。
  3. 如果要使用现有的公共子服务,则仍然要由实现控制器实际对特定变量进行订阅和监视,并相应地更新其相应的作用域。但是,如果您设计应用程序的方式使控制器从共享作用域继承变量,则可以避免这种情况。然后,他们将自动更新他们的材料使用正常的角度机制。遗憾的是,这并不总是能够实现的,而剩下的就是必须实现一个公共服务。
票数 1
EN

Stack Overflow用户

发布于 2015-05-14 11:31:17

工厂与服务和提供者之间的区别只与依赖注入器如何向您提供它们的实例有关。服务是专为提供单例而设计的,但只是添加了单例特定功能的工厂的包装器。没有什么能阻止你从工厂送回单身人士。

使用服务来共享状态--您需要一个单例,而一个服务使定义和注入单例变得很容易。

代码语言:javascript
复制
SomeService:
    var foo = {
        bar = 'a'; 
    };
    function getFoo() {
        return foo; 
    }

SomeController[SomeService injected here] :
    $scope.foo = SomeService.getFoo();
    $scope.$watch('foo.bar', ...);
    $scope.setFooBar = function(val) {
        $scope.foo.bar = val;
    };

<a href="" ng-click="setFooBar('2')">2</a>

这里的一般模式是永远不要执行$scope.foo = { bar: 'Some other reference' };,因为当您覆盖它--“臭名昭著”的总是使用“点”在$scope的东西问题时,依赖于SomeService的所有其他事情都不会得到新的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30236003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档