ng-switch 和 angular-input-modified 行为

ng-switch and angular-input-modified behavior

尝试使用 angular-input-modified 模块来跟踪用户是否对表单进行了任何更改。通过全局禁用行为来使用包含策略,然后仅将可修改的行为添加到所需的表单字段。 我的问题是跟踪 collection 内的变化。更具体地说,我得到了 collection 个项目,当用户 select 时显示了一个项目对应的属性。当用户更改任何 属性 时,它应该启用保存按钮。 到目前为止我试过这个:

            COLLECTIONS
            <select ng-model="wiDevCtrl.currentCollection"
                    ignore-dirty
                    ng-options="opt as opt.Name for opt in wiDevCtrl.device.Collections"></select>

并且现在基于用户 selection of collection item 将显示具有相应内容的复选框

 <div class="form-group subSection" bs-modifiable="true">               
   <input type="checkbox"                          
          ng-model="wiDevCtrl.currentCollection.IsTriggerImmediately" /> </div>

但是这种方法导致将 angular-input-modified 模块中的 'modified' 标志更改为 'true' 因为显然当 collection 更改时它会更改复选框中的值(通过绑定)不同于像 $pristine 值一样保存。

我认为,如果我为每个 collection 创建 "peronal" 复选框,问题就会解决。为此,我尝试使用开关:

<div class="form-group subSection">               
            <div ng-switch on="wiDevCtrl.currentCollection.Name" bs-modifiable="true">
                <div ng-switch-when="ng-switch-default"></div>
                <div ng-switch-when="1">
                    <input type="checkbox"                               
                           ng-model="wiDevCtrl.currentCollection.IsTriggerImmediately" />
                </div>
                <div ng-switch-when="2">
                    <input type="checkbox"                               
                           ng-model="wiDevCtrl.currentCollection.IsTriggerImmediately" />
                </div>
                <div ng-switch-when="3">
                    <input type="checkbox"                              
                           ng-model="wiDevCtrl.currentCollection.IsTriggerImmediately" />
                </div>                   
            </div>
        </div>

在那之后我几乎得到了正确的行为,除了一件事。当我更改复选框时,它会将 'modified' 正确设置为 true。但是当我切换到另一个 collection 和 return 时,这个复选框的 'masterValu'e 变成了相反的,就像我调用 $pristine 一样,但我没有。我预计,当我 return 到之前的 collection 并将复选框更改回原始 'modified' 时,状态将是 'false'。这显然没有发生。有任何想法吗?谢谢。

您可以找到 Plunker 示例 here

  1. 单击导航中的 Maracuya select 或者。检查复选框。观察 MaracuyaLike 大师:"false" 和修改:是的。
  2. 现在select任何其他水果。
  3. 回到马拉库亚。观察 MaracuyaLike Master 变成 "true" 和 Modified: No. Form 处于修改状态,无法返回未修改状态。

我联系了这个库的作者。显然图书馆只适用于固定元素。 ng-Switch 和 ng-If 将重建 DOM 元素,因此所有元素都将重置为默认值。修复它的唯一方法是将动态元素更改为固定元素,然后 show/hide 它们相应地像这样:

 <input name = "myFruits" ng-repeat="x in user.favoriteFruit" ng-show="user.favoriteFruit.id == $index" type="checkbox" ng-model="fruits[$index].like" bs-modifiable="true">

你可以找到 plunk here