我的模型看起来像这样:
var mymodel = {
name: {
en: 'Ten',
es: 'Diez',
fr: 'Dix'
}
};
一个看起来像的视图:
<section ng-controller="MyController" ng-init="findOne()">
<form ng-submit="update()">
<div ng-repeat="(language, string) in mymodel.name">
<label>Name ({{language | uppercase}}):</label>
<input type="text" ng-model="mymodel.name[language]">
</div>
<input type="submit" value="Update">
<pre>{{mymodel}}</pre>
</form>
</section>
当我修改文本框的值时,pre中的对象也会按预期更改。
但是,当我提交表单时,控制器会将初始值发送到后端,而不是修改后的值。
客户端控制器如下所示:
angular.module('mymodule').controller('MyController', [..., function(...){
...
$scope.update = function() {
var mymodel = $scope.mymodel;
console.log(mymodel.name);
console.log(mymodel);
mymodel.$update(function() {
...
//Does not work as expected. Sends initial data instead of updates.
});
};
...
$scope.findOne = function() {
$scope.mymodel = MyFactory.get({
id: $stateParams.id
});
};
...
}]);
对于examlpe,如果我输入以下字符串:&#34; Fifty&#34;,&#34; Cincuenta&#34;,&#34; Cinquante&#34;,然后点击&#34;更新&#34 ;,第一个console.log(mymodel.name)输出新值:
Object {
es: "Fifty",
en: "Cincuenta",
fr: "Cinquante"
}
但是第二个console.log(mymodel)输出了初始值:
Resource {
$promise: Object
$resolved: true
...
name: Object
en: "Ten",
es: "Diez",
fr: "Dix"
...
}
结果是该条目未在后端更新。
修改
非常感谢您的回答,我发现了错误。该问题以某种方式由Mongoose ODM中的interationalization插件创建。当使用lowdash扩展响应的属性时,某些内容(我还没有找到确切的内容)阻止了文档的更新,并返回了原始值。
对不起,这与Angular无关,我在找错了地方。
答案 0 :(得分:1)
我用你的代码创建了一个plunk。我还添加了文件data.json
,用于获取ngResource
的数据,但我使用id
代替filename
,代码将与您的代码更相似。数据返回很棒。视图已更新。
然后我尝试发出数据保存(按Update
按钮),仅查看console.log
s。数据以console.log
的相同更新编写:
console.log(mymodel.name);
返回:
Object {en: "a", es: "a", fr: "a"}
并且
console.log(mymodel);
返回
Resource {
$promise: Object
$resolved: true
name: Object {
en: "a"
es: "a"
fr: "a"
}
我认为一切都必须正常。
答案 1 :(得分:0)
这个问题是你绑定到my model.name[language]
而不是你在hg-repeat中使用的迭代。最简单的解决方案是更改模型(如果可能)以使用类似于names: [{‘lang’:’es’,’value’:’Diez’},{‘lang’:’en’,’value’:’Ten’}]
的结构。然后,您可以使用标准ng-repeat=“name in model.names”
,然后与ng-model=“name.value”
如果您坚持使用该模型,可以先尝试var mymodel = angular.copy($scope.mymodel);
,看看它是否有所作为。如果你组成了一个模仿你的例子的plunker或jsfiddle,那么调试解决方案会更容易。