Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ng-repeat execution forces input to lose focus

I have an input that is created using ng-repeat

    <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>

I want this to prepopulate the inputs with the values that are in currentQuestion['possible_answers'] and I also want any changes to bind to this variable as well.

However, everytime I start typing into one of these text fields, I type one letter and then it looses focus of the input box. I have a feeling that this is because I start typing and the data bidning updates currentQuestion. Because currentQuestion is updated, the ng-repeat is executed again.

Is there a way to make the ng-repeat action a one off action isntead of constantly revalutating?

like image 561
moesef Avatar asked Sep 04 '14 01:09

moesef


People also ask

What is ng-focus event in AngularJS?

AngularJS ng-focus Event Directive. In angularjs ng-focus event directive is used to define or execute custom behaviour functions whenever input field gets focus. Suppose in angularjs if you want to change textbox colour on focus or call some custom functions on input field focus it’s better to use ng-focus event.

What is ng-repeat directive in angular?

The ng-repeat directive repeats a set of HTML, a given number of times. The set of HTML will be repeated once per item in a collection. The collection must be an array or an object.

What is the ng-focus directive?

Definition and Usage The ng-focus directive tells AngularJS what to do when an HTML element gets focus. The ng-focus directive from AngularJS will not override the element's original onfocus event, both will be executed.

How to change textbox background colour using ng-focus event in AngularJS?

Following is the example of changing textbox background colour whenever textbox gets focus using ng-focus event in angularjs application. Enter Text: <input type="text" ng-class=" { demoFocus: focus}" ng-focus="focusfn ()" ng-blur="blurfn ()" ng-model="ftxt">


Video Answer


1 Answers

Yes (looking at the symptoms, you did not show us the data) your issue could be because your model is the text in the array that you (may have), so whenever you update the model, it will trigger digest cycle since ng-repeat is tracked by the text. You can easily fix this by providing. track by $index, so that the ng-repeat is watched over and repeat watch gets updated only when the array changes in its length.

 <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

You can also use $index to get the array's index. you do not need to iterate with (key, value).

However i would just make my answer array an array of objects and get rid of all these issues, and it would just be (_note the usage of $index and 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

like image 105
PSL Avatar answered Oct 17 '22 05:10

PSL