Причина, по которой метод iShouldrepeatOneTime
вызывается 4 раза, связана с тем, что Angular по умолчанию ChangeDetectionStrategy . По умолчанию каждый раз, когда происходит изменение в вашем компоненте, в этом случае для каждого цикла Angular будет проверять весь ваш компонент на наличие изменений. Единственный способ для Angular узнать, изменилось ли возвращаемое значение iShouldrepeatOneTime
, это вызвать его.
Так как же это обойти? На ум приходит два варианта:
- Использовать
OnPush
ChangeDetectionStrategy или - Убедитесь, что вы не привязываете методы в своем шаблоне по причинам, отличным от отправителей событий. Вместо этого свяжите со свойствами.
Я остановлюсь на втором моменте. Представьте, что у вас есть свойство в вашем компоненте someValue
и метод calculateSomeValue()
следующим образом:
someValue = 'foo';
calculateSomeValue(): string {
return 'bar';
}
В вашем шаблоне наличие {{ someValue }}
более эффективно, чем {{ calculateSomeValue() }}
, поскольку в прежнем подходе Angularуже знает, изменилось ли значение свойства и нужно ли его обновлять в представлении. В последнем подходе Angular должен сначала вызвать метод, прежде чем он узнает, нужно ли ему обновить значение в представлении.