AngularJS:数据绑定和点表示法
AngularJS: Databinding and dot-notation
我想我只是在AngularJS中的点符号上浪费了一些时间。
这个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
时应该使用对象(点表示法有助于解决搜索嵌套作用域时的参考问题)。但是,我不知道这也适用于这样的简单情况。我更惊讶的是,如果我使用数组(并使用推送/拼接对其进行修改),对我的对象的引用将保持机智:另一个 Plunker
有人可以解释为什么当我重新分配数据绑定时,它不再适用于value
?有没有办法在不从服务传递包装器对象的情况下实际绑定到值?
这是因为每当从 Javascript 中的函数返回对象时,您实际上是在返回对对象的引用。在您的示例中
this.getObject = function(){
return output;
};
返回对object
的引用。对此引用所做的任何更改都将反映在实际对象中,这就是数据绑定为此工作的原因。
然而,当您从函数返回字符串时,您返回的是值,而不是对实际字符串的引用。
this.getVal = function(){
return output.string;
};
在这里,当您返回具有值"init"
的字符串时,您将返回一个字符串output.string
。对object.string
所做的任何修改都不会再更改返回的字符串,这就是为什么数据绑定失败的原因 value
.
有关详细信息,请参阅此答案。
函数getVal在那个时间点返回output.string的值。 然后,将此值分配给变量 $scope.val。所以在那个时间点 output.string 是"Init",因此 $scope.val 的值是 "Init"这永远不会改变,为什么会改变?这与 angularjs 2 向数据绑定或点表示法无关。您只需将值"Init"分配给$scope.val,并且再也不会更改它,这是一个纯粹的javascript问题。
- 在VanillaJS中模拟模型双向数据绑定
- Telerik rad组合框多列数据绑定
- 数据绑定:'系统Char'不包含名为'xxxxx'
- OnsenUI AngularJS数据绑定无法正常工作
- Ionic-item在导航栏中进行双向数据绑定
- 基本D3.js:如何将具有其他属性的数据绑定到元素
- 使用自定义数据属性或将数据绑定到处理程序来处理事件
- ListView的ItemTemplate内的自定义HtmlControl的数据绑定失败
- $http中的Angular 1数据绑定承诺不起作用
- 在何处和何时添加具有数据绑定的元素
- 使用AngularJs数据绑定的三元运算符显示图像
- 为什么针对工厂的Angular数据绑定只适用于函数
- 敲除:如何使用可见数据绑定可见来隐藏段落标记
- 在数据绑定中使用对象敲除绑定
- 如何在angularjs中检查Kendo树视图数据绑定事件
- 将json数据绑定到剑道网格
- AngularJS数据绑定中断ngRepeat+奇怪行为
- JavaScript HTMLElement 属性上的数据绑定 在 Polymer 中
- 视窗 8/Metro UI 数据绑定 JavaScript
- AngularJS:数据绑定和点表示法