在以下example中,当项目的选项值发生变化时,我想调用我的服务的cmds.Add( new AcumaticaApiWS.Value { Value = "EA", LinkedCommand = SO301000.DocumentDetails.UOM } );
功能。
是否可以在不使用submitOption
/ ng-click
或修改ng-change
元素内的任何内容的情况下执行此操作?
我是棱角分明的新人,可能不是正确的做法。但我的目标是观察'以编程方式计算项目的值,并在更改后将其提交给服务器。
我了解form
,但我已经读过将范围传递给服务并不是一个好主意
答案 0 :(得分:1)
您可以在控制器中使用$scope.$watch
而不是服务:
$scope.records.items.forEach(watchRecordValue);
function watchRecordValue(record){
$scope.$watch(function(){ return record.option; }, function(newVal, oldVal){
if(newVal !== oldVal){
$scope.records.submitOption(record);
}
});
}
但是,我认为以上是一种疯狂的解决方法,绝对应该避免。
它会更清洁,更易于维护,使用更快 - 正如您提到的那样,您正在避免 - ng-change
。实际上,您只需将HTML上的输入标记更改为:
<input name="options"
type="radio"
ng-model="item.option"
ng-change="records.submitOption(item)"
ng-value="option.id" />
(ng-change="records.submitOption(item)"
部分是唯一的区别。)
编辑(添加“包装”解决方案):
如果修改表单确实不可行,可以将表单包装在自己的指令中。这是一个人为的例子:
myApp.directive('myWatch', [function () {
return {
restrict: 'A',
scope: {
myWatch: '=',
myHandler: '@',
},
link: function(scope, element, attr) {
scope.$watch('myWatch', function(newVal, oldVal){
if(newVal !== oldVal){
// Parent because we've created a scope for this directive
scope.$parent.$eval(attr.myHandler); // Copied from ngChange...
}
});
}
};
}]);
现在,您可以通过打包来保持表单不变:
<div my-watch="item.option" my-handler="records.submitOption(item)">
<form> <!-- your old form contents go here --> </form>
</div>
这是使用此包装器修改的JSFiddle:http://jsfiddle.net/shjejb34/
注意:几乎每个阅读此内容的人都应该执行上面的ng-change
解决方案。包装器指令正在重新发明轮子,复制Angular已经为我们提供的良好功能。