2016-10-15 1 views
0

Я столкнулся с проблемой из-за моего очень низкого понимания основных концепций AngularJs (я думаю). У меня есть список кликабельных слов. Когда я нажимаю на них, они меняют цвет (индивидуально) с помощью классов меток Bootstrap. Он отлично работает, но ... (здесь это :)): Если я нажму кнопку «Попробовать еще раз», я не могу вернуть цвета в состояние init, потому что я не могу установить 'this.selected' в ' false "... См. приведенный ниже код.Возврат в состояние init после ng-click в ng-repeat?

Я уверен, что это не так сложно, но я застрял так, чтобы кто-нибудь мог дать мне подсказку, я был бы признателен.

<h2 class="jumbleW inline" ng-repeat="w in word track by $index"> 
    <span ng-class="{'label': true, 'label-primary': !this.selected, 'label-warning': this.selected}" ng-click="pickWord(w)">{{w}}</span> 
</h2> 

<button class="btn btn-danger btn-xs" ng-click="clear()">Try again</button> 

EDIT: Извините за ошибки моего новичка. Я принял выпуск вышеуказанного кода (голый HTML). Вот и мой pickWord() функция():

$scope.pickWord = function(w){ 
    this.selected = !this.selected; 
    if (this.selected == false) { 
     $scope.playerAnswer = $scope.playerAnswer.replace(w, ""); 
    } else { 
     $scope.playerAnswer += w; 
    } 
} 
+0

показать полный код с HTML –

+0

Спасибо @Aruna за это идеальный ответ! Я не могу голосовать за полезный ответ, но вы позволили мне улучшить и отлично работать. Я представил себе более лаконичный способ сделать это, хотя, поскольку это тот «материал», который я обычно делаю, и я всегда чувствую, что это не лучший способ делать вещи (я должен ошибаться в этом!). Кстати, кто-то проголосовал за мой вопрос: (Нет исследований? Я потратил около 1 часа на это. Хорошо, это может показаться смешным, но новички действительно существуют и могут иметь проблемы с новичками и смотреть в неправильном направлении;) – Celfred

+0

@Celfred Это здорово слышать и не уверен, кто проголосовал, поскольку вы новичок. Я все равно проголосую, счастливое кодирование :-) – Aruna

ответ

0

Не используйте this. Вместо этого добавьте свойство к объекту ng-repeat w, если его объект в противном случае создает массив для выбранного индекса, как показано ниже.

html

<h2 class="jumbleW inline" ng-repeat="w in word track by $index"> 
     <span ng-class="{'label': true, 'label-primary': selectedItems.indexOf($index) === -1, 'label-warning': selectedItems.indexOf($index) !== -1}" ng-click="pickWord(w, $index)">{{w}}</span> 
    </h2> 

<button class="btn btn-danger btn-xs" ng-click="clear()">Try again</button> 

JS

$scope.pickWord = function(w, i){ 
    if(!$scope.selectedItems){ 
     $scope.selectedItems = []; 
    } 

    var index = $scope.selectedItems.indexOf(i); 

    if(index === -1) { // not selected already and add 
     $scope.selectedItems.push(i); 
     $scope.playerAnswer += w; 
    } else { // selected already and remove 
     $scope.selectedItems.splice(index, 1); 
     $scope.playerAnswer = $scope.playerAnswer.replace(w, ""); 
    } 
} 

$scope.clear = function(){ 
    $scope.selectedItems = []; 
};