【问题标题】:Items disappear when editing inside an Angular ngRepeat在 Angular ngRepeat 中编辑时项目消失
【发布时间】:2015-11-13 01:52:06
【问题描述】:

我有一个项目数组,每个项目都显示为 ng-repeat 中的指令,如下所示:

<div ng-repeat="item in ctrl.data | filter:ctrl.query"  class="ubi-box container-fluid">
  <user-item item="item" . . .></user-item>
</div>

如您所见,ng-repeat 上有一个过滤器。在指令中,用户可以编辑表单中的项目,当用户单击其中一个项目时会显示这些项目。

当用户编辑影响过滤器的字段时会出现问题。如果用户使用过滤器 (ctrl.query) 找到了该项目,并且如果编辑后的文本意味着该项目不再与过滤器匹配,则该项目会在用户点击保存或其他任何操作之前突然消失。噗!

最优雅的解决方案是什么?我不想在编辑开始时关闭过滤器,因为这样所有项目都会重新出现。我希望过滤器仍然有效,但我希望正在编辑的项目即使被过滤掉也能继续显示。

我是否在每个项目中设置一个“isOpen”标志,并在过滤器中添加一个“or isOpen”子句?添加这样的标志对我来说总是很笨拙,我什至不确定如何在过滤器语法中做到这一点。

是否向过滤器添加“or isFormVisible”子句?这可能更简洁,但同样,我什至如何在 ngRepeat 过滤器语法中做到这一点?

想法?

提前致谢

约翰

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    可能有更优雅的解决方案,但我可能会遵循 Angular 文档中的示例。

    https://docs.angularjs.org/guide/forms#binding-to-form-and-control-state

    开始编辑时,将正在编辑的项目复制到填充编辑控件的新对象(幕后的视图控件仍然是主对象)。保存后,将更新后的对象复制到主对象中,此时主对象将恢复为查看模式,并且会被过滤器隐藏。

    类似的东西:

      $scope.edit = function (item){
        $scope.editItem = angular.copy(item);
      }
    
      $scope.saveTo = function(item){
        for (var i = 0; i < $scope.items.length; i++){
          if ($scope.items[i].id === item.id){
            $scope.items[i] = angular.copy($scope.editItem);
            break;
          }
        }
    
        $scope.editItem = {};
      }
    

    我将正在编辑的项目中的 ID 与列表中每个项目的 ID 进行比较,以确保一次只能对一个项目进行 ng-if'd。这是一个示例plunk


    更新:这是另一个plunk,它使用不同的查询过滤器,您所做的只是在进入编辑模式时设置一个标志到一个id。与之前的类似,但没有主目标代码。如果您已经有编辑模式,这似乎应该很快就能应用。

    【讨论】:

    • 这就是我害怕的答案,因为重写很多代码需要做很多工作:(我希望只是调整过滤器,也许(现在我读了更多)用一个函数. 但我担心你可能是对的。我在我的应用程序的其他地方使用过这种模式,所以我很了解它。谢谢。
    • @John 我又给了它一次旋转。
    • 我开始着手实施您的第一个答案,而且由于我构建指令的方式,实施起来并不难。这并不比您的第二个答案难:只需几行代码。 (我已经将复制模型模式用于表单重置功能,所以只需将其反转以保存表单,并将副本传递给表单指令。)那么哪个是更可靠的方法,你认为?第一个复制模型模式来自文档,所以也许我应该这样做?谢谢一百万。
    • @John 我认为这取决于您的代码和您的意图。通过不自动更新主模型可以获得一些好处。例如,如果这是您保存的模型,您将无法在实际想要之前意外发布和保留正在编辑的模型,因为您尚未更新原始模型。我认为原版实际上是我的首选。另外,如果我对你有帮助,介意至少给我一个赞成票吗? :)
    【解决方案2】:

    我建议使用ng-model-options$render 选项,这是一个工作示例:http://plnkr.co/edit/IFpXBYeJx1wrbKhhzMZg?p=preview

      <form name="userForm">
        <label>Name:
          <input type="text" name="name" ng-model="name" ng-model-options="{ updateOn: 'click' }" />
        </label>
        <button ng-click="userForm.userName.$render();">Update Now</button>
        <br />
      </form>
    

    【讨论】:

    • Won't updateOn:'click' 只是延迟更新直到用户点击某些东西?我不需要 updateOn:'submit' 吗?这样做的问题是,我的表单有很多实时验证,例如测试有效的电子邮件地址,如果我延迟模型更新,验证不会在正确的时间运行。
    • 我没有亲自尝试过,但我相信你正在寻找 form.username.$error 是否有错误,所以如果你的模式是否已经更新,你能给试一试
    猜你喜欢
    • 2013-11-30
    • 2020-04-19
    • 2019-08-02
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2016-08-08
    相关资源
    最近更新 更多