2017-03-08 97 views
1

晚上好,

我使用AngularJS编写一个应用程序,我需要为应用程序与POST请求的服务器的NodeJS发送数据。

我的数据结构像一个json对象,并且它具有数据绑定感谢AngularJS框架。

截至目前,一个函数正在动态地尝试创建用户可能喜欢的一些input标签内的可能值。一个例子:

<button ng-click="generateFoodAndBeverages(row)>Generate</button> 
<input type="text" ng-model="row.service.day.beverage" placeholder="beverage" /> 
<input type="text" ng-model="row.service.day.food" placeholder="food" /> 

的两个输入值可以由用户通过在键入值来设定他们想(例如,“可乐”,“汉堡”),但上面的输入标签是一个按钮,可以为用户生成输入值。

生成值的函数从数组中获取它们,然后在函数结尾返回两个可能的值,一个用于饮料,一个用于食物。

当它有两个返回值它改变了两个输入属性值,将它们设置为通过函数产生的两种可能性:

jQuery("#input1").attr("value", generateFoodAndBeverages(row)[0]); 
jQuery("#input2").attr("value", generateFoodAndBeverages(row)[1]); 

这是不完美的,也不优雅,但它的工作。每次用户请求自动生成食物和饮料时,该函数都会填充并动态更改这两个输入元素的值属性,以便实际设置值并确实存在。即使如此,即使我在屏幕上将它们看作输入字段内的文本,我的POST请求也不会识别ng模型实际发生更改的事实。 ng-model将更改注册到输入字段的value属性的唯一方法是如果用户使用键盘输入内容,则手动更改value属性。另一个例子:

<input type="text" value="generateValue()" ng-model="row.service.info" /> 

这里的一个根本不改变ng模型的值。

<input type="text" value="User Typed Value" ng-model="row.service.info" /> 

这另一种代替确实改变了NG-模型价值和它的变化和存在,它被传递到以后可以作为一个POST请求到服务器发送的$范围。

有关为什么输入字段的“自动和动态生成”值在用户类型值没有被ng模型注册时有何想法?

在此先感谢!

[编辑]

显然,问题就来了与ng-model不改变。我试图通过在输入中应用ng-change来调试该问题。如果更改是通过javascript完成的,则它不会被注册到ng-model,并且ng-change函数不会触发,因为即使我可以清楚地看到javascript为输入标记设置的新值,ng-model也没有更改。如果我手动更改输入标记的值,则触发ng-change,并且控制台记录更改。

如果每行都没有那么不同,我可以直接将这些更改应用于ng-model

具有NG-模式是这样的:

<input ng-model="row.serviceInfo.DayObject[dayString].food" /> 
<input ng-model="row.serviceInfo.DayObject[dayString].beverage" /> 

我如何将能够直接应用这些变化给定的模型是如何动态是NG-模型。作为一个例子,我可以有1000行,每行都有自己的serviceInfo对象。我不知道如何使用动态生成的值为每个行更改模型。

[编辑]

的问题确实有NG-模式不改变。该解决方案包括将更改应用于动态生成的值函数内的每个元素的ng模型。感谢大家的意见。如果有人遇到同样的问题,我会在这里留下这段代码!再次感谢!

 let foodEl = angular.element(the row element food input); 
     let beverageEl = angular.element(the row element beverage input); 

     $scope.displayedCollection[i].serviceInfo = { 
     "day" : { 
      "food" : generatedValuesFood(el, day), 
      "beverage" : generatedValuesBeverage(el, day) 
     } 
     }; 

     foodEl.val($scope.displayedCollection[i].serviceInfo.day.food); 
     beverageEl.val($scope.displayedCollection[i].serviceInfo.day.beverage); 
+1

嗨,尽量简化这里的东西 – digit

+3

您的代码似乎有点复杂,所以很难确保(也许你可以创建一个蹩脚的最低限度?),但解释似乎是因为你正在使用jQuery进行更改。我的理论是,你使用“.attr”,也许你应该使用“.prop”来实际改变财产的价值,但即使如此,我不知道它会起作用。无论如何,我不会为了这个特定的目的混合使用Angular和jQuery,你应该尝试在任何地方使用Angular绑定。 – ssougnez

+0

你说得对,我在jQuery部分使用.attr来更改输入元素的值,并且该值在函数生成时未在ng模型绑定中注册。 – mnemosdev

回答

1

我觉得你的问题很简单。正如@ssougnez所说,不要将jquery和angularjs混合使用。 Angularjs使用数据绑定概念,不要使用jquery样式来改变输入值,而是使用ng-model指令将数据从模型绑定到HTML控件(input,select,textarea)上的视图。在您的generateFoodAndBeverages功能,根据该行的如刚刚成立的NG-模型值:

var generateFoodAndBeverages = function() { 
    $scope.row.service.day.beverage = array[0]; 
    $scope.row.service.day.food = array[1]; 
}; 
+0

谢谢,这个答案帮助我以自己的方式解决问题:D – mnemosdev