【问题标题】:Editing a delimited string using multiple input fields in AngularJS在 AngularJS 中使用多个输入字段编辑分隔字符串
【发布时间】:2014-03-11 02:53:31
【问题描述】:

到目前为止,我正在尝试执行以下操作,但没有成功。

我有一个用分号分隔的字符串。说一个电子邮件列表,所以

'email1@example.com;email2@example.com;email3@example.com'

我想要完成的是将此字符串(使用 split(';'))拆分为字符串数组或对象数组(以帮助绑定)。我想绑定到不同输入元素的每个项目。编辑后我想再次读取连接值以发送到我的后端。

问题是在编辑其中一个拆分输入时,原始项目值没有更新(这是有道理的,因为我猜测各个项目是原始部分的副本),但我想知道是否有办法做这样的事情。 请注意,我希望这是双向的,因此查看单个输入并手动更新原始输入只会触发无限循环的更新。

我尝试了几种不同的方法,包括使用 Object.defineProperty 创建一个项目属性 get/set 来读取和访问字符串(从未触发 set)。

take a look at this plnker

【问题讨论】:

    标签: javascript string angularjs angularjs-directive user-input


    【解决方案1】:

    您可以在每个字段更新时构造一个临时数组,以便用新值替换旧段的字符串。为了解决失去焦点的问题,您将不得不使用 ngReapeat 的track by $index。除非您将分隔符添加到原始字符串,否则不会重新创建内部数组。

    这里是complete solution on Plunker

    【讨论】:

      【解决方案2】:

      您的主要问题是重复输入元素上的 ng-model 属性。我将首先使用ng-repeat$index 变量来正确绑定ng-model。在您原来的 Plunker 中,“名称”NOT 是您可以绑定到的范围属性,因此应将其更改为 ng-model="names[$index]"

      Here 是反映这一点的 Plunker。为了清晰起见,我做了很多更改并有一个工作示例。

      注意:您会发现,当编辑直接绑定到中继器的字段时,每次更改都会触发 $digest 并且您重复的 <input> 元素会刷新。 所以下一个要解决的问题是发生这种情况后,重新关注您正在编辑的元素。有很多解决方案,但是,这应该在不同的问题中回答。

      【讨论】:

        【解决方案3】:

        虽然不鼓励绑定到字符串原语,但您可以尝试ng-list

        <form name="graddiv" ng-controller="Ctrl">
          List: <input name="namesInput" ng-list ng-model="vm.names"/>
          <ul>
            <input ng-repeat="name in vm.names track by $index" ng-model="name" ng-change="updateMe($index, name)"/>
          </ul>
        

        由于原始字符串绑定,您需要通过 $index 跟踪和 ng-change 处理程序。

        function Ctrl($scope) {
          $scope.vm = {}; // objref so we can retain names ref binding
          $scope.vm.names = ['Christian', 'Jason Miller', 'Judy Dobry', 'Bijal Shah', 'Duyun Chen', 'Marvin Plettner', 'Sio Cheang', 'Patrick McMahon', 'Chuen Wing Chan'];
          $scope.updateMe = function($index, value){
            // ng quirk - unfortunately we need to create a new array instance to get the formatters to run
            // see http://stackoverflow.com/questions/15590140/ng-list-input-not-updating-when-adding-items-to-array
            $scope.vm.names[$index] = value; // unfortunately, this will regenerate the input
            $scope.vm.names = angular.copy($scope.vm.names); // create a new array instance to run the ng-list formatters
          };
        }
        

        这是您更新后的plunkr

        【讨论】:

        • 很好的解决方案,但这并不是我想要的。您正在使用一个字符串数组作为原始源,而我有一个分号分隔的字符串。 track by id 是用于绑定到基元的,但我必须归功于他首先使用的 cleftheris。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        相关资源
        最近更新 更多