AngularJS:数据绑定和点符号

时间:2016-02-11 13:53:28

标签: javascript angularjs data-binding service

我想我只是在AngularJS中用点符号丢失了几个小时。

This Plunker表明了仍然让我恼火的问题:

app.controller('MainCtrl', function($scope, ValueService) {
$scope.obj= ValueService.getObject(); // Output: {"string": "New!!!"}
$scope.val = ValueService.getVal(); // Output: "init"
ValueService.setVal();

})
.service('ValueService', function(){
var output= {string: 'init'};

this.setVal = function(val){
output.string = 'New!!!';
};

this.getObject = function(){
return output;
};

this.getVal = function(){
return output.string;
};

return this;
});

我确实知道在使用ng-model时我应该使用对象(点符号有助于在搜索嵌套范围时解决引用问题)。但是我不知道这也适用于这样的简单案例。我更加惊讶,因为如果我使用数组(并使用push / splice修改它),对我的对象的引用保持不变:another Plunker

当有人重新分配时,有人可以解释为什么数据绑定对value不起作用了吗?有没有办法实际绑定到值而不从服务传递包装器对象?

2 个答案:

答案 0 :(得分:2)

这是因为无论何时从Javascript中的函数返回一个对象,实际上都是返回对象的引用。在你的例子中

this.getObject = function(){
    return output;
};

返回对object的引用。对此引用所做的任何更改都将反映在实际对象中,这就是数据绑定对此有用的原因。

然而,当您从函数返回一个字符串时,您将返回该值,而不是对实际字符串的引用。

this.getVal = function(){
    return output.string;
};

当您返回值output.string的{​​{1}}时,您将返回一个字符串。对"init"所做的任何修改都不会再更改返回的字符串,这就是object.string数据绑定失败的原因。

有关详细信息,请参阅this answer

答案 1 :(得分:0)

函数getVal返回output.string AT THAT POINT IN TIME的值。然后将此值赋给变量$ scope.val。 所以在那个时间点,output.string是" Init"因此$ scope.val的值是" Init" 这永远不会改变,为什么会这样呢? 这与angularjs双向数据绑定或点表示法无关。 您只需指定值" Init"到$ scope.val并且永远不会再改变它,这是一个纯粹的javascript事情。