AngularJS:如何使用属性绑定对象?

时间:2014-10-21 11:54:50

标签: angularjs angularjs-scope angularjs-ng-repeat

我的模型看起来像这样:

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无关,我在找错了地方。

2 个答案:

答案 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"
  }

我认为一切都必须正常。

演示:http://plnkr.co/edit/6AzIsQ2vfsKZGR9RERwL?p=preview

答案 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,那么调试解决方案会更容易。