【问题标题】:Is angularJS service singleton?angularJS 服务是单例的吗?
【发布时间】:2015-01-20 10:05:11
【问题描述】:

我有一个服务方法,它会改变一个布尔变量的值(false 是默认值)并返回给控制器。 通过单击按钮调用此服务方法。

考虑一下,我点击了这个按钮,现在变量值为真。 现在,我正在从另一个控制器访问相同的服务方法,但它是错误的.. 为什么?

怎么了?

第一个控制器,

 .controller('myController1',....
$scope.value = false;
$scope.buttonClick = function(){
            $scope.value = myService.setValue(value);
}

第二个控制器,

.controller('myController2',.....
$scope.value = myService.getValue();

服务,

angular.module('myModule', [])
 .service('myService', ['OtherTypes',
  function (OtherTypes) {

  var   myServiceVariable = false;
   return {
    setValue: function (value) {
                myServiceVariable = !value;
                return (myServiceVariable);
            },

  getValue: function () {
                return myServiceVariable;
            }
}
}
]);

【问题讨论】:

  • 是的,角度服务是单例的。你的代码一定有问题。粘贴一些代码。:)
  • 你是在使用DI获取控制器中的服务吗?
  • 是的,正在向控制器注入服务。我已经更新了我的问题..请再次参考。
  • myController2 是否与 myController1 同时初始化?
  • 不...这将在controller1之后初始化。

标签: angularjs


【解决方案1】:

看起来你有一个错字:你用,而不是;分隔两个函数。改为:

myServiceVariable = false;
setValue: function (value) {
               myServiceVariable = !value;
               return (myServiceVariable);
            };

getValue: function () {
       return myServiceVariable;
   };
}

此外,由于您将第二个控制器中的值作为函数的返回值而不是对服务变量本身的直接引用,因此不要期望它会自动更新。您每次都必须调用getValue() 函数。

【讨论】:

  • 是的,我每次都调用 getValue()... 替换 ;相反,不起作用:(
  • @Dosti 尝试在getValue() 方法中调试?是否正确进入函数?
  • @Dosti 应该可以正常工作.. 尝试在myServiceVariable 声明之前将console.log('init') 放在服务中,让我们看看它被调用了多少次。
【解决方案2】:

您好,下面的代码应该显示服务在 angularjs 中是单例的。

    myApp = angular.module("myApp",[]);

myApp.service("myService", function(){
    myServiceVariable = false;
    return {
        setValue: function (value) {
               myServiceVariable = value;
               return (myServiceVariable);
        },

        getValue: function () {
            return myServiceVariable;
        }
    }
});

myApp.controller("controller1", function($scope, myService){
    console.log(myService);
    $scope.clickHandler = function(){
        myService.setValue(!myService.getValue());
    }
});

myApp.controller("controller2", function($scope, myService){
    console.log(myService);
    $scope.getServiceValue = function(){
        return myService.getValue();
    }
});

对于一个工作演示,你可以去here

【讨论】:

  • 我可以在我现有的代码中看到,controller1、controller2 和 service 的模块名称不同。是不是有问题?
  • 我更新了我的代码,以便 myService、controller1 和 controller2 都在 3 个不同的模块中。您只需要确保您使用的所有模块都包含在您的主代码中。 jsfiddle.net/chandings/p0zxjevs/6 更新代码的链接。
  • 是的,这与我的代码相同...这里我们同时初始化控制器。考虑我是否从控制器 1 打开一个弹出窗口,然后初始化控制器 2,并访问 getValue() 方法。
  • 请拿起我分享的小提琴的叉子,并更新你想在上面做的事情。如果问题仍然存在,请在此处分享链接。
  • 如果您正在打开一个弹出窗口,那么您正在创建一个单独的 html 页面和一个单独的 Angular 应用程序。因此,实际上您的服务将是一个不同的实例,因为它是一个不同的应用程序。如果您正在为现代浏览器创建本地存储,您可以使用本地存储,如果它在同一个域中并且您传递的值非常小,则可以使用 cookie。否则,您可以尝试在弹出窗口中传递应用程序对象。我没有做过类似的事情,所以我不知道它是否会起作用。
猜你喜欢
  • 2014-02-25
  • 2013-05-13
  • 2013-03-13
  • 2014-12-30
  • 2011-01-11
  • 2020-01-15
  • 2016-12-30
  • 2017-01-25
  • 1970-01-01
相关资源
最近更新 更多