javascript - AngularJS:数据绑定(bind)和点表示法

标签 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 时应该使用对象(点表示法有助于解决搜索嵌套范围时的引用问题)。然而我不知道这也适用于像这样的简单案例。我更惊讶的是,如果我使用数组(并使用推送/拼接修改它),对我的对象的引用保持不变: another Plunker

有人可以解释为什么当我重新分配它时数据绑定(bind)不再适用于吗?有没有办法在不从服务传递包装对象的情况下实际绑定(bind)到值?

最佳答案

这是因为每当你从 JavaScript 中的函数返回一个对象时,你实际上返回的是一个对象的引用。在你的例子中

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

返回对对象的引用。对此引用所做的任何更改都将反射(reflect)在实际对象中,这就是数据绑定(bind)适用于此的原因。

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

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

当您返回具有值“init”的output.string时,您将返回一个字符串。对 object.string 进行的任何修改都不会再更改返回的字符串,这就是 value 数据绑定(bind)失败的原因。

参见this answer了解更多信息。

关于javascript - AngularJS:数据绑定(bind)和点表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35341225/

相关文章:

javascript - 如何在某些功能后正确重置 angularjs v1 工厂

javascript - Angular 改变个人值(value)会改变全局值(value)

JavaScript 抛出 : "is not a function" when I pass object as argument

javascript - 将内容添加到 inline-block-div 会以意想不到的方式弄乱布局

javascript - Angularjs/ASP.NET : How can I read a json returned from my controller and set it to a variable?

angularjs - Angular UI 路由器无法使用 Internet Explorer 9 进行解析

javascript - AppleScript:如何更改网站选项菜单的值?

javascript - slider jquery + 在页面加载时调用javascript函数的约束来调用javascript函数

silverlight - MVVMLight、Silverlight、 Entity Framework

asp.net - 如何向中继器内的用户控件提供 'data'?