لدي مكون يبدو كالتالي:
<td class="topic-rating">
<span class="rating-title">{{ratingName}}</span>
<form>
<input type="hidden" name="topic_id" value="{{topic.id}}">
{{#unless useNames}}{{ratingLow}}{{/unless}}
{{#each this.ratingOptions as |option|}}
<RadioButton
@name={{option.name}}
@value={{option.value}}
@selection={{this.myRating}}
@onChange={{this.submitRating}}
/>
{{#if useNames}} <span class="rotated-label">{{option.label}}</span>{{/if}}
{{/each}}
{{#unless useNames}}{{ratingHigh}}{{/unless}}
</form>
</td>
التقييمات عبارة عن مصفوفة مضافة إلى مُسلسل topic_view وتحتوي على topic_id و rating_id في كل عنصر من عناصر المصفوفة.
ولدي هذا الكود الجافاسكريبت الداعم:
...
export default class TopicRatingComponent extends Component {
get myRating() {
const ratingId = this.args.id;
const rating = this.args.topic.user_ratings.find((rating) => Number(rating.rating_id) === Number(ratingId));
return rating?.rating_value;
}
...
إنه يعمل كما هو متوقع. وعندما أنقر على أحد RadioButtons، فإنه يستدعي دالة تقوم بإجراء POST وتحديث نموذج مخصص تم إضافته إلى مُسلسل الموضوع. إذا قمت بتحديث الصفحة، فكل شيء يكون متوقعًا، ولكني أريد أن يتم تحديث أزرار الراديو هذه مباشرة (في الوقت الحالي، تبقى أزرار راديو متعددة مضاءة إذا قمت بتغييرها عدة مرات).
وحدة التحكم الخاصة بي تفعل هذا:
MessageBus.publish("/topic/#{params[:topic_id]}", reload_topic: true)
لذا أعتقد أن الأشياء يجب أن يتم تحديثها في المواضيع المعروضة في قائمة المواضيع.
أعتقد أن المشكلة هي أنني بحاجة إلى استخدام @discourseComputed بدلاً من get، ولكن عندما أفعل ذلك، أحصل على خطأ. ربما لا يمكنني استخدام @discourseComputed في مكون؟ ربما أحتاج إلى القيام بشيء ما . . . شيء آخر؟
تعديل: سألت ChatGPT وقال إنه يجب علي فعل شيء ما مع
import { tracked } from '@glimmer/tracking';، لذا أحاول ذلك الآن . . .