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
Javascript 服务属性被覆盖_Javascript_Angularjs - Fatal编程技术网

Javascript 服务属性被覆盖

Javascript 服务属性被覆盖,javascript,angularjs,Javascript,Angularjs,阅读本文时,我有一个印象,在注入服务时,会创建一个新的javascript对象,比如实例,修改一个实例不会影响其他实例。看来我弄错了。 看见我希望当按下Alert Foo controller name时,我会看到Foo/getFoo而不是bar/getFoo 请解释为什么它会这样工作以及可能的解决方法 我想将普通javascript对象重写为angularjs服务。这是一个restApi服务,它有GET、POST等方法,但现在实现它的方式是在工厂中在它的外部设置此服务的控制器部分,对于所有其余

阅读本文时,我有一个印象,在注入服务时,会创建一个新的javascript对象,比如实例,修改一个实例不会影响其他实例。看来我弄错了。 看见我希望当按下
Alert Foo controller name
时,我会看到
Foo/getFoo
而不是
bar/getFoo

请解释为什么它会这样工作以及可能的解决方法

我想将普通javascript对象重写为angularjs服务。这是一个restApi服务,它有GET、POST等方法,但现在实现它的方式是在工厂中在它的外部设置此服务的控制器部分,对于所有其余方法,只传递方法名称和参数。我想保持这种方式


谢谢

这正是正在发生的事情。请看这一行:

restApiService.setControllerName(...);
在两个服务中都被调用:
fooController
barController
(这是服务的可怕名称)。因为
restApiService
被实例化一次,所以当服务被实例化时,实际上是对相同的
restApiService
进行了两次变异,从而导致了不期望的行为

下面是一个更好定义的服务示例:

var-app=angular.module('plunker',[]);
app.service('restApiService',function(){
var=这个;
this.alertControllerName=函数(controllerName){
警报(控制器名称);
}
});
应用程序工厂('fooController',功能(重启服务){
var controllerName='foo';
返回{
alertControllerName:函数(){
restApiService.alertControllerName(controllerName);
}
}
});
应用程序工厂('barController',功能(重启服务){
var controllerName=‘bar’;
返回{
alertControllerName:函数(){
restApiService.alertControllerName(controllerName);
}
}
});
app.controller('MainCtrl',函数($scope,fooController,barController){
$scope.alertFoo=fooController.alertControllerName;
$scope.alertBar=barController.alertControllerName;
});

安古拉斯普朗克
文件。写(“”);
警报Foo控制器名称
警报栏控制器名称

了解AngularJS工厂、服务和供应商

所有这些都用于共享可重用的单例对象。它有助于在应用程序/各种组件/模块之间共享可重用代码

  • 延迟实例化–Angular仅在应用程序组件依赖于某个服务/工厂时实例化该服务/工厂
  • 单例–每个组件 依赖于服务获取对单个实例的引用 由服务工厂生成


啊,好的。这些只是我为普朗克编造的名字,但你们并没有理解我关于期望结果的观点。我想设置一次
控制器名
,这样我就不必通过每个请求。例如,
restApi
post
方法的签名是
函数(回调、方法名、数据)
,在里面我会将
controllerName
附加到
methodName
中,这是用于分析的吗?不。我希望避免重写大量代码。我更新了plunker以更好地显示预期结果。正如我所说的,在当前的实现中,controllerName在每个工厂初始化中只设置一次。我有一个代表特定控制器的工厂的大列表。在那里,控制器设置一次,并在
GET、POST、PUT
等中设置。不会传递方法controllerName,只传递方法的名称,因为已经设置了controllerName!如果我不能让它像这样工作,我必须检查每个工厂的方法,并将控制器的名称添加到方法的名称中。你不能。这正是我想告诉你的,伙计。因此,当您第二次覆盖以前的控制器名称时,
setControllerName