2014-09-04 2 views
8

У меня есть вход, который создается с помощью нг-повторитьнг-повтор силы исполнения вход потерять фокус

<div data-ng-repeat="(index, answer) in currentQuestion['possible_answers']" class="form-group"> 
     <label class="col-md-3 control-label">Answer {{ index + 1 }}</label> 
     <div class="col-md-8"> 
      <div class="input-icon"> 
       <i class="fa fa-sun-o"></i> 
       <input data-ng-model="currentQuestion['possible_answers'][index]" type="text" class="form-control" > 
      </div> 
     </div> 
    </div> 

Я хочу, чтобы это предварительно заполнить входы со значениями, которые находятся в currentQuestion['possible_answers'], и я также хочу каких-либо изменений для привязки к этой переменной.

Однако каждый раз, когда я начинаю вводить текст в одно из этих текстовых полей, я набираю одну букву, а затем теряет фокус ввода. У меня такое ощущение, что это происходит потому, что я начинаю печатать и обновлять данные currentQuestion. Поскольку обновляется currentQuestion, снова выполняется ng-repeat.

Есть ли способ сделать действие ng-repeat одним действием, постоянно пересматривающим?

+0

Можете ли вы попытаться связать «ответ» вместо использования индекса и снова найти его в своем массиве? –

ответ

18

Да (looking at the symptoms, you did not show us the data) Ваш вопрос может быть потому, что ваша модель является текст в массиве, (может иметь), поэтому при обновлении модели, она будет срабатывать переваривать цикл, так как нг-повтор отслеживается текст. Вы можете легко исправить это, предоставив. track by $index, так что просмотр ng-repeat просматривается, и повторное воспроизведение часов обновляется только тогда, когда массив изменяется по длине.

<div data-ng-repeat="answer in currentQuestion['possible_answers'] track by $index" class="form-group"> 
    <label class="col-md-3 control-label">Answer {{ $index + 1 }}</label> 
    <div class="col-md-8"> 
     <div class="input-icon"> 
      <i class="fa fa-sun-o"></i> 
      <input data-ng-model="currentQuestion['possible_answers'][$index]" type="text" class="form-control" > 
     </div> 
    </div> 
</div> 

Demo

Вы также можете использовать $index, чтобы получить индекс массива. вам не нужно перебирать (key, value).

Однако я бы просто сделать мой массив ответов массивы объектов и избавиться от всех этих проблем, и это будет просто (_Примечание использования $index и ng-model): -

<div data-ng-repeat="answer in currentQuestion['possible_answers'] track by $index" class="form-group"> 
    <label class="col-md-3 control-label">Answer {{ $index + 1 }}</label> 
    <div class="col-md-8"> 
     <div class="input-icon"> 
      <i class="fa fa-sun-o"></i> 
      <input data-ng-model="answer.text" type="text" class="form-control" > 
     </div> 
    </div> 
</div> 

Demo

+0

'track by $ index' - это то, что я хотел. Выполняйте только ng-repeat при изменении количества элементов. – moesef

+0

@moesef Yup. Когда вы имеете дело с объектами, вы можете установить отслеживание с помощью уникального свойства объекта. В основном то, что происходит, когда вы используете track by ng-repeat, не удаляет и не воссоздает DOM, если это необходимо, если базовый объект изменяется, то он просто обновляется. Если вы имеете дело с объектами, и вы не укажете трек, он добавит к ним уникальный ключ '$$ hashKey', поэтому, если вы обновите список, он снова их воссоздает, с отслеживанием, если вы обновите его, будет обновляться только существующие элементы и удалить только те, которые должны быть. – PSL

+0

Это довольно большая функциональность. Спасибо за помощь. – moesef

0

ng-repeat создает новый охват для каждого элемента в списке. В этой области он знает index и answer. Вы привязываете значение ввода к чему-то вне области видимости, а именно к тому же элементу массива. Изменение этого параметра вызывает перерисовку списка, что приводит к тому, что входной сигнал блокируется.

<div data-ng-repeat="(index, answer) in currentQuestion['possible_answers']" class="form-group"> 
    <label class="col-md-3 control-label">Answer {{ index + 1 }}</label> 
    <div class="col-md-8"> 
    <div class="input-icon"> 
     <i class="fa fa-sun-o"></i> 
     <input data-ng-model="answer" type="text" class="form-control" > 
    </div> 
    </div> 
</div> 
+0

попробовал, но тогда currentQuestion не будет правильно связываться – moesef

+0

@moesef Можете ли вы показать нам, как выглядит ваш массив? – PSL

Смежные вопросы