将原始类型和对象传递给Conntrollers时的区别

时间:2016-08-12 08:12:12

标签: javascript angularjs

我发布了一些例子,因为我认为你更容易理解我的问题。

我有这个HTML标记

<div ng-app="autoDrops" ng-controller="testController as test">
    <div ng-controller="simpleController as simple">
        <a href="" ng-click="test.addValue(value, test.testValue)">Add</a>
        <a href="" ng-click="test.addValue2(value2, test.testValue2)">Add2</a>
    </div>
    <a href="" ng-click="test.addValue(value, test.testValue)">Add</a>
    <a href="" ng-click="test.addValue2(value2, test.testValue2)">Add2</a>
    <p>
        {{test.testValue}}
    </p>  
    <p>
        {{test.testValue2}}
    </p> 
<div>

和我的AngularJs控制器定义如下

var autoDrops = angular.module('autoDrops', []);
autoDrops.controller('testController', function ($scope) {
    this.testValue = 0;
    $scope.value = 1;
    this.addValue = function(value, testValue){
        //why function not work, if i remove this?
        testValue = testValue + value;
    }
    $scope.value2 = {value:"1"};
    this.testValue2 = [];

    this.addValue2 = function(value, testValue2){
    //this function work with this?
        testValue2.push(value);
    }
});
autoDrops.controller('simpleController', function ($scope) {
    $scope.value = 1;
    $scope.value2 = {value:"1"};
});

示例您可以看到jsfiddle

3 个答案:

答案 0 :(得分:2)

正如@MMHunter所说,这是因为在第一种情况下你传递一个简单的值,而在第二种情况下,你传递一个数组。

数组通过引用传递,值按值传递。

所以,如果你想让它改变作品

  1. this.testValue = 0;this.t = {testValue : 0};
  2. test.addValue(value, test.testValue)test.addValue(value, test.t)
  3. 而且......
  4. this.addValue = function(value, testValue){
      //why function not work, if i remove this?
      testValue = testValue + value;
    }
    

    this.addValue = function(value, t){
      //why function not work, if i remove this?
      t.testValue = t.testValue + value;
    }
    

答案 1 :(得分:1)

当您未使用this时,您没有更新范围变量,this.testValue = 0会覆盖它,因此this.testValue仍会打印0

答案 2 :(得分:0)

可能的解决方案之一是使用对象this来更新值。

this.testValue = testValue + value;