Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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
angularJS服务是单例的吗?_Angularjs - Fatal编程技术网

angularJS服务是单例的吗?

angularJS服务是单例的吗?,angularjs,Angularjs,我有一个服务方法,它将更改布尔变量的值(false是默认值)并返回控制器。 我通过单击按钮调用此服务方法 考虑一下,我点击这个按钮,现在变量值为真。 现在,我从另一个控制器访问同一个服务方法,结果是错误的。。为什么? 怎么了 第一控制器 .controller('myController1',.... $scope.value = false; $scope.buttonClick = function(){ $scope.value = myService.setVa

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

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

怎么了

第一控制器

 .controller('myController1',....
$scope.value = false;
$scope.buttonClick = function(){
            $scope.value = myService.setValue(value);
}
.controller('myController2',.....
$scope.value = myService.getValue();
第二控制器

 .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;
            }
}
}
]);

看起来您有一个输入错误:您正在用
而不是
分隔这两个函数。改为:

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

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

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

hi下面的代码应该显示服务在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();
    }
});

对于正在运行的演示,您可以去

是的,角度服务是单例的。你的代码一定有问题。粘贴一些代码。:)您是否使用DI在控制器中获取服务?是的,我将服务注入控制器。我已经更新了我的问题。请再次参考。myController2是否与myController1同时初始化?否。。。这将在controller1之后初始化。是的,我每次都调用getValue()。。。更换;相反,不起作用:(@Dosti尝试在
getValue()
方法中进行调试?它是否正确地进入函数?@Dosti应该工作正常..尝试放置
console.log('init'))
在声明myService变量之前的服务中,让我们看看调用了多少次。我可以在现有代码中看到,controller1、controller2和service的模块名称不同。这是否造成了问题?我更新了代码,以便myService、controller1和controller2都位于3个不同的模块中。所有你需要确定的是你使用的所有模块都包含在你的主代码中。链接到更新的代码。是的,这是同一个代码。在这里,我们同时初始化控制器。考虑如果我从控制器1打开弹出窗口,然后初始化控制器2,并访问GETValueE()。方法。请拿起我共享的小提琴并更新您想要在上面执行的操作。如果问题仍然存在,请在此处共享链接。如果您正在打开一个弹出窗口,则您正在创建一个单独的html页面和一个单独的Angle应用程序。因此,实际上,您的服务将是一个不同的实例,因为它是一个不同的应用程序。您可以使用本地store i如果您正在为modern browser或Cookie创建同一个域,并且您传递的值非常小。其他方面,您可以尝试在弹出窗口中传递应用程序对象。我没有做过类似的操作,因此我不知道它是否有效。