为什么int
中的json_var
和int
的数据同步?
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);
}
}
] );
答案 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时,我遇到了同样的挫败感。我认为很多人都这样做。