我想我只是在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
不起作用了吗?有没有办法实际绑定到值而不从服务传递包装器对象?
答案 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事情。