服务中的价值变更通知

时间:2015-07-24 01:05:33

标签: javascript angularjs

在以下example中,当项目的选项值发生变化时,我想调用我的服务的cmds.Add( new AcumaticaApiWS.Value { Value = "EA", LinkedCommand = SO301000.DocumentDetails.UOM } ); 功能。

是否可以在不使用submitOption / ng-click或修改ng-change元素内的任何内容的情况下执行此操作?

我是棱角分明的新人,可能不是正确的做法。但我的目标是观察'以编程方式计算项目的值,并在更改后将其提交给服务器。

我了解form,但我已经读过将范围传递给服务并不是一个好主意

1 个答案:

答案 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已经为我们提供的良好功能。