Это возможно путем объединения amp-bind
и amp-list
:
<amp-bind-macro id="classForRating" arguments="rating, index" expression="rating >= index ? 'star-full' : (rating >= (index - 0.5) ? 'star-half' : 'star-empty')" ></amp-bind-macro>
<amp-state id="state" src="rating.json"></amp-state>
<amp-list width="136" height="24" src="rating.json" single-item items="rating" noloading>
<template type="amp-mustache">
<div class="star-rating" aria-label="rating: {{.}}" [aria-label]="'rating: ' + state.rating">
<span [class]="classForRating(state.rating, 1)" class="star-empty"></span>
<span [class]="classForRating(state.rating, 2)" class="star-empty"></span>
<span [class]="classForRating(state.rating, 3)" class="star-empty"></span>
<span [class]="classForRating(state.rating, 4)" class="star-empty"></span>
<span [class]="classForRating(state.rating, 5)" class="star-empty"></span>
</div>
</template>
<div class="star-rating" placeholder>
<span class="star-empty"></span>
<span class="star-empty"></span>
<span class="star-empty"></span>
<span class="star-empty"></span>
<span class="star-empty"></span>
</div>
</amp-list>
Хитрость заключается в использовании одной и той же конечной точки для amp-state
и amp-list
.Кэширование ответов во время выполнения AMP гарантирует, что это приведет только к одному запросу.Привязки AMP внутри списка усилителей будут оцениваться при визуализации содержимого списка.Это позволяет устанавливать значения звездочек (с помощью классов CSS), используя amp-bind
.
Чтобы обеспечить удобство загрузки, я также отключил индикатор загрузки по умолчанию для списка усилителей с помощью атрибута noloading
.Вместо этого я использую элемент placeholder
, показывающий пустые звезды при загрузке.
Здесь - рабочая версия.