angularjs-基于脏范围简化表单(自动)提交

angularjs-基于脏范围简化表单(自动)提交,angularjs,angularjs-scope,dirty-data,Angularjs,Angularjs Scope,Dirty Data,问题空间 我有一个问题,我提交的表单是基于满足的标准,而不是有一个表单提交按钮 假设我有3个下拉列表,前两个是分组的,但需要选择一个,这意味着我可以选择一个或另一个,但不能让它们为空,第三个是必填字段 之后,页面会自动获取结果 假设我有复选框和更多的下拉列表。在前面提到的3个下拉列表、复选框和下拉列表中的任何未来选择都会自动过滤结果 我所知道的 现在,在阅读angular文档之后,我检查了$dirty、$pristine以及这两个方面的操作,比如$setDirty和$setPristine;然而

问题空间

我有一个问题,我提交的表单是基于满足的标准,而不是有一个表单提交按钮

假设我有3个下拉列表,前两个是分组的,但需要选择一个,这意味着我可以选择一个或另一个,但不能让它们为空,第三个是必填字段

之后,页面会自动获取结果

假设我有复选框和更多的下拉列表。在前面提到的3个下拉列表、复选框和下拉列表中的任何未来选择都会自动过滤结果

我所知道的

现在,在阅读angular文档之后,我检查了$dirty、$pristine以及这两个方面的操作,比如$setDirty和$setPristine;然而,这似乎是为了一个目的

所以我假设这在整个范围内都是有用的。我没有看到我能为所选范围找出的任何倾向

到目前为止我拥有的

所以基本上,我希望我能利用示波器的跟踪功能,但我对它知之甚少。我为我的应用程序创建了一个控制器和一个作用域,因为这对我来说似乎是最简单的。我有一些第三方插件在这个范围内发挥作用,比如:

$scope.3rdpartyConfig={ 建议1:[], prop2:getData() }

如果我要检查表单的$dirty状态,我认为这样的东西在检查表单提交时不会有用

然后我想到了我过去做事的老方法,但“角度化”了:

所以我会有这样的想法:

<input type="checkbox" ng-model="state.Checked" ng-change="checkIfWeCanSubmitThenSubmit()" id="ng-change-example1" />
但我认为这不是一种有棱角的做事方式,因为这样做肯定不方便

我希望这个作用域能够提供某种方式,在我提交和获取数据之前,我可以检查我的作用域的哪些部分是脏的,或者是否有比将这个函数附加到每个html元素更好的方法;比如有一种我可以检查和观看的范围跟踪器

这提醒了我,我不想有一系列的$scope。$watch也一样,只是绑定到每一段html代码会有太多的工作,除非有办法查看一组特定范围变量的范围,那么,我不介意

比如(请原谅伪代码):

编辑(2013年2月28日):

我试着这样做:

$scope.masterCriteria =
[
    { DropDown1: $scope.AppModel.Dropdown1},
    { DropDown2: $scope.AppModel.Dropdown2 },
    { DropDown3: $scope.AppModel.Dropdown3 },
    { Checkbox1: $scope.AppModel.Checkbox1 },
    { Checkbox2: $scope.AppModel.Checkbox2 }
];

$scope.$watch('masterCriteria', function (newVal) {
    if (newVal) { logger.info("did I change?"); }
}, true);

观察者没有检测到任何东西,并且在$watch中没有拾取我更改为AppModel范围的任何值。值得一试,仍在努力解决这个问题。

您可以稍微更改与输入表单相关的模型和分组字段。把它们放在一个物体里。像这样:

 $scope.state = { checkbox1: false, checkbox2: true, ... }
稍后将输入框绑定到
状态
对象的字段:

 <input ng-model="state.checkbox1" ... >

很有趣,那么您是不是建议我创建另一个范围变量,比如。。readyToSubmit,并让该变量检查其他范围变量的数据?然后在readyToSubmit上放一块手表?这听起来很有趣。在我看来,这实际上是一种代理模式。
 $scope.state = { checkbox1: false, checkbox2: true, ... }
 <input ng-model="state.checkbox1" ... >
 $scope.$watch('state', ...