Aurelia class.bind не запускает функцию

У меня есть Aurelia View следующим образом:

<li repeat.for="pageNumber of numOfPages">
   <a class.bind="isCurrentPage(pageNumber) ? 'blueBackground' :''" click.delegate="pageClicked(pageNumber)">
      ${pageNumber}
   </a>
</li>

и модель следующим образом:

pageClicked(pageNumber: number) {
    this.currentPage = pageNumber;
}


isCurrentPage(pageNumber: number) {
    return this.currentPage === pageNumber;
}

Он работает только для первого элемента a и добавляет для него класс bluBackground. Но когда я нажимаю на любой другой элемент a, он не запускает метод isCurrentPage, поэтому класс не обновляется.

Однако, когда я заменяю условие следующим образом:

<li repeat.for="pageNumber of numOfPages">
    <a class="page-link" class.bind="pageNumber === currentPage ? 'blueBackground' : ''" click.delegate="pageClicked(pageNumber)">
    ${pageNumber}
    </a>
</li>

Он отлично работает, и класс blueBackground добавляется к каждому a, по которому щелкнули.

Мой вопрос в том, какая разница в выполнении кода в class.bind, например

  1. isCurrentPage(pageNumber) и

  2. pageNumber === currentPage

    и почему функция isCurrentPage(pageNumber) не вызывается каждый раз в первом случае? Спасибо.


person Akshay Khot    schedule 17.10.2016    source источник


Ответы (1)


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

person Kelly Ethridge    schedule 17.10.2016
comment
Извините за неясность в моем первоначальном вопросе, но я обновил окружающий тег для элемента <a>. Это часть тега <li>, который зацикливается, а pageNumber принимает разные значения. Надеюсь, это понятно. - person Akshay Khot; 17.10.2016
comment
Да, он изменяет pageNumber на <li>, однако каждый элемент <li> отслеживает свой pageNumber, который никогда не меняется в своем class.bind. Вызов pageClicked с его pageNumber не приведет к обновлению class.bind, потому что class.bind не смотрит currentPage. class.bind будет вызывать isCurrentPage(pageNumber) только в том случае, если значение pageNumber изменилось. Он никогда не меняется после первоначального назначения. Однако во втором примере прослушивается currentPage, поэтому, когда событие click изменяет его, class.bind обновляется. - person Kelly Ethridge; 17.10.2016
comment
Это имеет смысл. Что вы подразумеваете под 1. Calling pageClicked with its pageNumber won't cause class.bind to update because class.bind doesn't watch currentPage 2. the second example does listen to currentPage - person Akshay Khot; 18.10.2016
comment
Что определяет, отслеживает ли привязка конкретную переменную? - person Akshay Khot; 18.10.2016
comment
Как вы заметили, пример 2 наблюдает за currentPage и обновляет по клику. Пример 1 не наблюдает за currentPage, несмотря на то, что он также изменяется по клику. Свойство должно быть частью выражения привязки, чтобы его можно было отслеживать. class.bind="isCurrentPage(pageNumber)" вообще не заботится об изменении currentPage, но class.bind="pageNumber === currentPage ? true : false" наблюдает как за pageNumber, так и за currentPage и обновляет данные при изменении currentPage. - person Kelly Ethridge; 18.10.2016
comment
Спасибо за подробную информацию. Я не знал, что все свойства в выражении привязки отслеживаются. Спасибо. - person Akshay Khot; 18.10.2016