Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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_Arrays_Service_Reference - Fatal编程技术网

Javascript 角度服务-通过引用私有值返回私有值与赋值

Javascript 角度服务-通过引用私有值返回私有值与赋值,javascript,angularjs,arrays,service,reference,Javascript,Angularjs,Arrays,Service,Reference,与同事讨论获取私有数组的返回值与分配给作为私有数组引用的变量之间的区别,但想不出以下情况产生不同结果的原因: 控制器 app.controller("MyController", ["MyService", function(MyService) { var ctrl = this; ctrl.arrayAssign = []; ctrl.doSomething = function() { // Empty out array, usually ass

与同事讨论获取私有数组的返回值与分配给作为私有数组引用的变量之间的区别,但想不出以下情况产生不同结果的原因:

控制器

app.controller("MyController", ["MyService", function(MyService) {
    var ctrl = this;
    ctrl.arrayAssign = [];

    ctrl.doSomething = function() {
        // Empty out array, usually assigned at one point, code is omitted for example
        ctrl.arrayAssign = []

        // This does not work, ctrl.arrayAssign = []
        ctrl.arrayAssign = MyService.serviceArray;

        // This works, ctrl.arrayAssign correctly assigned to serviceArray in MyService
        ctrl.arrayAssign = MyService.getServiceArray();
    }
}]);
服务

app.service("MyService", [function(){
    var service = this;
    var serviceArray = [];

    service.serviceArray = serviceArray;

    // This is called, either from controller above, or another controller
    service.assignToServiceArray = function(arr) {
        serviceArray = angular.copy(arr);
    };

    service.getServiceArray = function() {
        return serviceArray;
    };

    return service;
}]);
注意:在service.assignToServiceArray()之后调用ctrl.doSomething()

对于上述两个控制器分配的结果不同,有什么好的解释吗?

我认为service.serviceArray会公开私有数组serviceArray,并只是成为私有数组的引用(service.serviceArray=serviceArray),因此会对serviceArray进行新的分配(即从service.assignToServiceArray),应允许service.serviceArray引用可由控制器直接访问的新阵列分配

getServiceArray()还将直接公开私有变量serviceArray,正如我不试图访问一个仅作为数组引用的变量(即上面的service.serviceArray)


在这种情况下,尝试将引用分配给私有变量是不理想的,而只返回私有值是可取的吗?我可能遗漏了一些非常明显的东西…

当您调用assignToServiceArray时,您为serviceArray分配了一个局部变量以指向一个新数组,您不更新引用或更新原始数组,因此service.serviceArray仍然指向启动它的空数组。。。如果您在没有赋值的情况下执行angular.copy(arr,serviceArray),您将得到实际数组保持不变(相同的数组对象)但其内容被清空并重新填充的结果,在这种情况下,service.serviceArray和serviceArray都将具有更新的数组。如果我错过了这个问题,请告诉我。

当调用assignToServiceArray时,您将serviceArray局部变量分配给指向新数组,而不更新引用或更新原始数组,因此service.serviceArray仍指向启动它的空数组。。。如果您在没有赋值的情况下执行angular.copy(arr,serviceArray),您将得到实际数组保持不变(相同的数组对象)但其内容被清空并重新填充的结果,在这种情况下,service.serviceArray和serviceArray都将具有更新的数组。如果我错过了问题,请告诉我。

service.serviceArray=serviceArray
将对
[]
数组的引用分配给
serviceArray
属性,而不是对
serviceArray
变量的引用

当一个新值被分配给
serviceArray
时,它被分配给这个变量,而不是其他变量

一个好处是它接受两个参数并允许保留对对象的引用:

如果提供了目标,将删除其所有元素(用于数组)或属性(用于对象),然后将源中的所有元素/属性复制到目标

因此,它将与:

angular.copy(arr, serviceArray);
该服务实际上误用了JS提供的OOP特性<代码>服务服务接受构造函数。如果它的行为与普通对象构造函数类似,则不会出现类似的问题:

app.service("MyService", [function(){
    this.serviceArray = [];

    service.assignToServiceArray = function(arr) {
        this.serviceArray = arr;
    };

    service.getServiceArray = function() {
        return this.serviceArray;
    };

    // not needed
    // return service;
}]);
如果
MyService.serviceArray
应该在其重新分配后使用,则应该仅通过其getter和setter方法在任何地方引用它。OOP中使用getter和setter的实际原因是该值保持私有,并且从不直接从外部访问。例如,鉴于:

{{ vm.MyService.getServiceArray()[0] }}

service.serviceArray=serviceArray
将对
[]
数组的引用分配给
serviceArray
属性,而不是对
serviceArray
变量的引用

当一个新值被分配给
serviceArray
时,它被分配给这个变量,而不是其他变量

一个好处是它接受两个参数并允许保留对对象的引用:

如果提供了目标,将删除其所有元素(用于数组)或属性(用于对象),然后将源中的所有元素/属性复制到目标

因此,它将与:

angular.copy(arr, serviceArray);
该服务实际上误用了JS提供的OOP特性<代码>服务服务接受构造函数。如果它的行为与普通对象构造函数类似,则不会出现类似的问题:

app.service("MyService", [function(){
    this.serviceArray = [];

    service.assignToServiceArray = function(arr) {
        this.serviceArray = arr;
    };

    service.getServiceArray = function() {
        return this.serviceArray;
    };

    // not needed
    // return service;
}]);
如果
MyService.serviceArray
应该在其重新分配后使用,则应该仅通过其getter和setter方法在任何地方引用它。OOP中使用getter和setter的实际原因是该值保持私有,并且从不直接从外部访问。例如,鉴于:

{{ vm.MyService.getServiceArray()[0] }}

明白了!我发现service.serviceArray仍然在引用初始化时使用的旧数组,我不太确定副本如何将一个完全不同的数组分配给serviceArrayCool是的,格式稍微好一点,estus的解释也更清楚。明白了!发现service.serviceArray仍然在引用初始化时使用的旧数组,不太确定副本如何将一个完全不同的数组分配给serviceArrayCool是的,estus的格式稍微好一点,解释也更清楚。快速问题,在service.assignToServiceArray中,this.serviceArray是否成为arr的引用?一般来说,使用这样的构造函数会引用传入的数组。根据您的经验,您希望在服务中使用该阵列的引用(如果可能)还是副本?在我看来,你希望在你的服务中有一个副本,因为从不同的控制器传递引用可能会变得混乱,除非你很小心并且知道你在做什么:PYes,它会变成一个引用。它始终取决于是否应该复制或分配它。但我不能想象一个场景