数据绑定Controller-Service:适用于对象但不适用于数字

时间:2013-12-18 23:07:27

标签: json angularjs data-binding service integer

为什么int中的json_varint的数据同步?

myService.json_var发生变化时,

$scope.json_var会更新。 myService.int_var发生变化时,$scope.int_var未更新。

var myApp = angular.module('myApp', []);

myApp.factory('myService', [
  function() {
     return {
        json_var : {val:17},
        int_var : 36
     }

     }
  ]);


myApp.controller('myCtrl', [ '$scope',  'myService', 
  function ($scope, myService)
  {
     $scope.json_var = myService.json_var; // doing this myService.json_var is updated when $scope.json_var changes
     $scope.int_var = myService.int_var; // no sync for int

     $scope.deb = function()
     {
        console.log($scope.int_var);
        console.log( myService.int_var);

        console.log($scope.json_var.val);
        console.log( myService.json_var.val);
     }
  }
] );

https://gist.github.com/SebSept/8ddcaad130ef9c091bd0

2 个答案:

答案 0 :(得分:2)

在JavaScript中,复合类型(对象,数组)通过引用传递(引用的副本,确切地说),并且基元(字符串,数字,布尔值)按值传递。

36是一个原始人。 当您将原语从服务(myService.int_var)传递到控制器($scope.int_var)时,36将按值传递。当您将$scope.int_var更改为42时,myService.int_var变量将不会反映更改(这是每种语言设计)。

另一方面,myService.json_var是一个复合词。当您将myService.json_var传递给$scope.json_var时,对myService.json_var对象的引用会按值传递给$scope.json_var变量。当您更改该变量内的某些内容时(例如,如果您将json_var.val更改为18),此更改也会反映在myService.json_var对象中,因此myService.json_var.val将等于{ {1}}也是。

tl; dr 确保总是有一个点“。”当你在Angular传递东西时,某处。

答案 1 :(得分:0)

数字不可变。绑定到数字很糟糕,因为一旦数字发生变化,就会丢失引用您绑定的内容,因为对旧数字的引用将丢失(对您而言)。如果要引用将要更改的数字,则必须将它们放在对象中然后绑定到对象(导致对象是可变的)。

在学习Angular时,我遇到了同样的挫败感。我认为很多人都这样做。