2015-08-01 2 views
2

Я выполнял приведенный ниже код (от «AngularJS» от Brad Green & Shyam Seshadri-O'Reilly). Приведенный ниже код устанавливает цвет фона как «Красный», для выбранной строки в таблице, а также удаляет цвет фона из ранее выбранной строки. Например, если я нажму на строку # 1, его фон будет установлен на «красный», тогда, если я нажму на строку №2, то фон будет установлен на «красный» , а цвет фона строки №1 станет нормальный (т. е. теперь он не красный).поведение ng-класса непонятно

Я не совсем понимаю, что, хотя я еще не написал код, чтобы повторно установить цвет фона других строк, как он сбрасывается?

<!-- View/Html --> 
    .selected { 
     background-color: red; 
     } 

    <table ng-controller="DynamicStyleCtrl"> 
     <tr ng-repeat='resturant in directory' ng-click='selectResturant($index)' 
      ng-class='{selected: $index==selectedRow}'> 
      <td>{{resturant.name}}</td> 
      <td>{{resturant.cuisine}}</td> 
     </tr> 
    </table> 

     <!-- Controller --> 
     function DynamicStyleCtrl($scope) { 
     $scope.directory = [ 
         {name:'The Handsome Heifer', cusine:'BBQ'}, 
         {name:'Greens', cusine:'Salads'}, 
         {name:'Fine Fish', cusine:'Sea food'} 
         ]; 
      $scope.selectResturant = function(row){ 
      $scope.selectedRow=row; 
      } 
     } 
+2

Все привязки пересчитываются в каждый цикл '$ digest', поэтому выражение для' selected' пересчитывается для каждой строки –

+2

То, что вы видите, представляет собой цикл Angle '$ digest' в действии: директива' ng-class' позволяет вы привязываете классы CSS к элементам DOM, условно, на основе некоторого выражения. Ссылки в этих выражениях добавляются в список «$ watch» в Angular, набор ссылок на свойства области (или другие переменные), которые могут измениться в ответ на события браузера. Когда происходит событие, Angular может вызывать цикл '$ digest', в котором он использует свой список' $ watch', чтобы обновлять привязки данных (на странице) или запускать обратные вызовы '$ watch' (внутри ваших контроллеров), сохраняя ваши приложение в синхронизации. –

+0

Спасибо Кирилл и Майкл за объяснение этого, он отвечает на мой вопрос. Теперь я могу понять, что, поскольку свойство «selectedRow» относится к $ scope, любое изменение этого свойства сбрасывает все привязки. –

ответ

4

Следующий код будет применяться класс «выбранный», когда $ индекс выбранной строки ===

ng-class='{selected: $index==selectedRow}' 

Таким образом, при выборе строки (через нг-клик) строка будет иметь класс «выбран», который будет установлен цвет фона на красный из ниже CSS:

.selected { 
    background-color: red; 
} 

Когда строка не выбрана потому, что выбран другой строки, на «выбранный» класс, который был применен с помощью нг-класса будут удалены и соответствующий css больше не будет применяться, поэтому он больше не будет красным.

Надеюсь, это поможет.

+0

Благодарим за ответ. Я думаю, что $ digest loop .../binding reset ... объясняет это поведение явно. –

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