2014-09-23 70 views
4

我找到了this相关主题,其中答案建议注意模型更改而不是更改选择。但在我的例子中,“模型”是列表中的对象的一部分。是否为列表中的每个对象初始化$watch正确的方法是?Angular - ngChange在ngModel之前触发<select>

选择

<li data-ng-repeat="obj in main.list track by $index"> 
    <select data-ng-change="main.changeStatus(obj)" data-ng-model="obj.status"> 
     <option value="A">A</option> 
     <option value="B">B</option> 
     <option value="C">C</option> 
    </select> 
</li> 

changeStatus

我需要更新对象或已接收到正确的对象改变方法。

main.changeStatus = function(obj) { 
    var r = new Resource(obj); 
    ... 
    r.$save({...}, function (savedObj) { 
    ... 
    }); 
} 

解决此问题的正确方法是什么?

感谢

编辑:我想我没有问正确的问题。

发布的代码没有达到我在找什么,因为更改方法在模型更新之前得到执行,因此我将不正确的/旧的对象发送到后端。现在有几种方法来解决这个问题

  • 创建一个新的变量,并通过对象的列表使用它作为模型
  • 迭代和$看每一个状态属性
  • 另一个我未知的方式?

意想不到我得到的新对象的变化方法,但我不知道如何。

编辑2:我试图写一个小提琴来说清楚,但它在那里工作。我需要更深入地了解我的代码,因为问题似乎在其他地方。

+0

你可以这样做 – 2014-09-23 12:11:29

+0

主要区别在于,当模型以编程方式更改时,ng-change将不会被触发,它只对输入值更改作出反应。 – 2014-09-23 12:13:39

+0

好的,但对象只能通过我想改变当前对象的“状态”属性。我将对象传递给“更改”方法,但传递对象的“状态”仍然是旧值。我想也许我不能将该对象传递给该方法,并试图从列表中读取它,但列表中的对象也未更新。 这意味着“更改”方法在对象的模型(状态)更改之前执行。但是我需要更改方法中的更新对象来更新数据库。 – KenavR 2014-09-23 12:54:30

+0

我的朋友,尝试使用* ng-options *指令简单文档学习在这里https://docs.angularjs。组织/ API /纳克/指令/选择并只可以通过除在NG-变化传递既OBJ和obj.status一起设置obj的状态将其设置像obj.status = obj.status [从NG-模型],我意味着你只能在你的代码中改变视图,你可以用ng-change方法在控制器中设置状态 – katmanco 2014-09-25 07:54:20