当前位置: 首页 > 面试题库 >

Angularjs服务是单例吗?

吴和硕
2023-03-14
问题内容

在参考资料中,我读到:

最后,重要的是要意识到所有Angular服务都是应用程序单例。这意味着每个喷油器只有一种给定服务的实例

但是用这个简单的代码似乎不是一个单例

'use strict';
            angular.module('animal', [])
                .factory('Animal',function(){
                    return function(vocalization){
                        return {
                            vocalization:vocalization,
                            vocalize : function () {
                                console.log('vocalize: ' + this.vocalization);
                            }
                        }
                    }
                });    
                angular.module('app', ['animal'])
                    .factory('Dog', function (Animal) {
                        return Animal('bark bark!');
                    })
                    .factory('Cat', function (Animal) {
                        return Animal('meeeooooow');
                    })
                .controller('MainCtrl',function($scope,Cat,Dog){
                     $scope.cat = Cat;
                     $scope.dog = Dog;
                     console.log($scope.cat);
                     console.log($scope.dog);
                    //$scope.cat = Cat;
                });

我有点困惑,你能解释一下我怎么了吗?

更新1 可能不是我不是棚里最犀利的工具,但是在@Khanh TO答复之后,这在参考文献中会是一个更好的解释,尚不十分清楚。

更新2

'use strict';
            angular.module('animal', [])
                .factory('Animal',function(){
                        return {
                            vocalization:'',
                            vocalize : function () {
                                console.log('vocalize: ' + this.vocalization);
                            }
                        }

                });
                angular.module('dog', ['animal'])
                    .factory('Dog', function (Animal) {
                        Animal.vocalization = 'bark bark!';
                        Animal.color = 'red';
                        return Animal;
                    });

                angular.module('cat', ['animal'])
                   .factory('Cat', function (Animal) {
                        Animal.vocalization = 'meowwww';
                        Animal.color = 'white';
                        return Animal;
                    });
                 angular.module('app', ['dog','cat'])
                .controller('MainCtrl',function($scope,Cat,Dog){
                     $scope.cat = Cat;
                     $scope.dog = Dog;
                     console.log($scope.cat);
                     console.log($scope.dog);
                    //$scope.cat = Cat;
                });

BOOM,这是一个单身人士!

更新3

但是如果你喜欢

'use strict';
            angular.module('animal', [])
                .factory('Animal',function(){
                    return function(vocalization){
                        return {
                            vocalization:vocalization,
                            vocalize : function () {
                                console.log('vocalize: ' + this.vocalization);
                            }
                        }
                    }
                });    
                angular.module('app', ['animal'])
                    .factory('Dog', function (Animal) {
                        function ngDog(){
                            this.prop = 'my prop 1';
                            this.myMethod = function(){
                                console.log('test 1');
                            }
                        }
                        return angular.extend(Animal('bark bark!'), new ngDog());
                    })
                    .factory('Cat', function (Animal) {
                        function ngCat(){
                            this.prop = 'my prop 2';
                            this.myMethod = function(){
                                console.log('test 2');
                            }
                        }
                        return angular.extend(Animal('meooow'), new ngCat());
                    })
                .controller('MainCtrl',function($scope,Cat,Dog){
                     $scope.cat = Cat;
                     $scope.dog = Dog;
                     console.log($scope.cat);
                     console.log($scope.dog);
                    //$scope.cat = Cat;
                });

有用


问题答案:

它是单例,只有一个对象,但是被注入到许多地方。(对象通过引用传递给方法)

您所有的Animal对象都是指向 同一动物对象的 对象指针,在您的情况下,这是一个 函数
。您CatDog是由此函数构造的对象。



 类似资料:
  • 本文向大家介绍AngularJS 单元测试服务,包括了AngularJS 单元测试服务的使用技巧和注意事项,需要的朋友参考一下 示例 服务编号 考试 跑!

  • 问题内容: 我已经使用CacheFactory创建了服务。我原以为是单身。我将其注入控制器中,并且在控制器范围内可以正常工作。但是,一旦我进入了具有不同范围的另一个页面,似乎就没有在不同范围中存储在同一控制器中的缓存中的值。CacheFactory的行为不应该是一个单例,在我注入CacheService的任何地方都具有那些相同的缓存对象吗? 这是我的服务示例: 然后在我的控制器中: 问题答案: 实

  • 问题内容: AngularJS在其文档中明确指出“服务是单例”: 违反直觉,也返回一个Singleton实例。 鉴于非单例服务有很多用例,实现工厂方法以返回Service实例的最佳方法是什么,以便每次声明依赖项时,它的另一个实例都可以满足? 问题答案: 我认为我们不应该让工厂返回一个有能力的函数,因为这会开始破坏依赖注入,并且该库的行为会很尴尬,尤其是对于第三方。简而言之,我不确定非单项服务是否有

  • 因此,活动将运行并停止服务,该服务将运行并停止服务。 我的问题是创建了的多个实例,该活动还创建了的多个实例。 因此,我希望将这两个作为运行,但我不确定如何这样做。 如果有必要,我可以发布一些我所拥有的示例代码,但我真正寻找的是一个操作方法。

  • 服务是一种由服务器端带到客户端的特性,它由来已久。AngularJS应用中的服务是一些用依赖注入捆绑在一起的可替换的对象。服务是最常和依赖注入一起用的,它也是AngularJS中的关键特性。

  • 问题内容: 我正在测试服务A,但是服务A取决于服务B(即服务B已注入服务A)。 我已经看到了这个问题,但是我的情况有所不同,因为我认为_模拟_ 服务B而不是注入服务B的实际实例更有意义。我将用茉莉间谍对其进行模拟。 这是一个示例测试: 我得到的错误是: 错误:未知提供程序:serviceBProvider 我该怎么做? 问题答案: 实际上,在AngularJS中,依赖注入使用“最后获胜”规则。因此