2016-09-05 39 views
5

Mam powtórzenie ng, które ma nowy element dodany, gdy tylko istniejący "ostatni" element zostanie zmodyfikowany w jakikolwiek sposób. Moja próba kątomierz wygląda mniej więcej tak:Używanie kątomierza do testowania aplikacji angularjs, w jaki sposób zachować odniesienie do jednego z wierszy elementu .all, gdy tablica zmienia się podczas pracy z nim?

var emptyPerson = this.people.last() // this gets me the last row of the ng-repeat 
emptyPerson.element(by.css('.firstName')).sendKeys('first'); // this sets the firstname correctly but then the app adds a new row to the ng-repeat because of the model change here. 
emptyPerson.element(by.css('.lastName')).sendKeys('last'); // this sets the lastname of the new row instead of the row that emptyPerson previously referenced 

Czy istnieje jakiś sposób, aby zasadniczo powiedzieć emptyPerson trzymać się tego samego elementu, aż skończymy z nim?

Przykład HTML przed FirstName jest edycja:

<div ng-repeat="person in object.People" class="student ng-scope"> 
    <div type="text" ng-model="person.FirstName" skip-label="true" placeholder="First" validator="svalidators[$index]" class="layout-default field field-FirstName type-text"> 
    <input type="text" ng-focus="myFocus()" ng-blur="myBlur()" class="form-control" placeholder="First" ng-model="lModel.val" name="person-FirstName"> 
    </div> 
    <div type="text" ng-model="person.LastName" skip-label="true" placeholder="Last" validator="svalidators[$index]" class="layout-default field field-LastName type-text"> 
    <input type="text" ng-focus="myFocus()" ng-blur="myBlur()" class="form-control" placeholder="Last" ng-model="lModel.val" name="person-LastName"> 
</div> 

przykład po FirstName jest edycja:

<div ng-repeat="person in object.People" class="student ng-scope"> 
    <div type="text" ng-model="person.FirstName" skip-label="true" placeholder="First" validator="svalidators[$index]" class="layout-default field field-FirstName type-text"> 
    <input type="text" ng-focus="myFocus()" ng-blur="myBlur()" class="form-control" placeholder="First" ng-model="lModel.val" name="person-FirstName"> 
    </div> 
    <div type="text" ng-model="person.LastName" skip-label="true" placeholder="Last" validator="svalidators[$index]" class="layout-default field field-LastName type-text"> 
    <input type="text" ng-focus="myFocus()" ng-blur="myBlur()" class="form-control" placeholder="Last" ng-model="lModel.val" name="person-LastName"> 
</div> 
<div ng-repeat="person in object.People" class="student ng-scope"> 
    <div type="text" ng-model="person.FirstName" skip-label="true" placeholder="First" validator="svalidators[$index]" class="layout-default field field-FirstName type-text"> 
    <input type="text" ng-focus="myFocus()" ng-blur="myBlur()" class="form-control" placeholder="First" ng-model="lModel.val" name="person-FirstName"> 
    </div> 
    <div type="text" ng-model="person.LastName" skip-label="true" placeholder="Last" validator="svalidators[$index]" class="layout-default field field-LastName type-text"> 
    <input type="text" ng-focus="myFocus()" ng-blur="myBlur()" class="form-control" placeholder="Last" ng-model="lModel.val" name="person-LastName"> 
</div> 
+0

Czy wejście "first name" poprzedniego do ostatniego elementu nie powinno mieć atrybutu "value" ustawionego na "first"? – alecxe

+0

nie. skojarzony model jest ustawiony jako pierwszy, a wartość właściwości elementu wejściowego jest ustawiona jako pierwsza, ale sam atrybut wartości nie istnieje i nie jest ustawiony. – Robert

+0

Okay, obawiam się, że po rozpoczęciu wypełniania danych musisz zbudować swego rodzaju "ręczne", brudne sprawdzanie. Jedną opcją byłoby sprawdzenie, czy wartość odpowiedniego modelu na wejściu imienia nie jest pusta. Lub po prostu przełącz się na element przed ostatnim po wypełnieniu imienia. Nie ładnie, zgadzam się. – alecxe

Odpowiedz

0

Spróbuj zapisać do zmiennej przed zmianami:

var oldLastName = emptyPerson.element(by.css('.lastName')); 
emptyPerson.element(by.css('.firstName')).sendKeys('first'); 
oldLastName.sendKeys('last'); 

Nadzieję, że to pomaga

+0

Nie, to nie powinno działać - kątomierz "aktywuje" wyszukiwanie elementu tylko wtedy, gdy zostanie na nim podjęte działanie. – alecxe

+0

A) W pytaniu mogło to nie być jasne, ale w rzeczywistości istnieje mnóstwo zmiennych, które trzeba byłoby uzyskać w ten sposób, więc zapisanie go na poziomie pola byłoby niepraktyczne. B) To i tak nie działa. Rzeczy, które zapisujesz w tym przypadku, to wciąż wyszukiwarka elementów, która śledzi całą drogę i rozwiązuje się tylko wtedy, gdy jest używana. Dzięki za to, że udało się. – Robert

1

W ten sposób kątomierz działa wewnętrznie. Poszukuje elementu w momencie wykonania działania na elemencie. Obawiam się, że musisz sobie z tym poradzić "ręcznie" i ponownie odnieść pożądany element wzmacniacza.

Aby poprawić nieco kodowanie, ukryłbym pierwszą interakcję z częścią elementu przemiennika w funkcji - w zasadzie dotykając wejścia wzmacniaka, by mieć jeszcze jeden element, a następnie zwracając element przed ostatnim . Coś wzdłuż linii:

var MyPageObject = function() { 
    this.people = element(by.repeater("person in object.People")); 

    this.touch = function() { 
     var emptyPerson = this.people.last(); 
     emptyPerson.element(by.css('.firstName')).sendKeys('smth'); 

     var newEmptyPerson = this.people.get(-2); // I think -1 would be the last 
     emptyPerson.element(by.css('.firstName')).clear(); 

     return newEmptyPerson; 
    } 

    this.fillForm = function() { 
     var emptyPerson = this.touch(); 

     emptyPerson.element(by.css('.firstName')).sendKeys('first'); 
     emptyPerson.element(by.css('.lastName')).sendKeys('last');  
    } 
}