أنا مبتدئ في هذا، آسف
لقد استخدمت ask discourse للسؤال:
في قالب، أريد عرض أول مشاركة من موضوعين فوق قائمة المواضيع في منفذ discovery-list-container-top
لقد أعطاني عدة إصدارات بدت لي وكأنها يجب أن تعمل. جميعها تسبب خطأ في المعاينة. أسأل discourse:
كيف يمكنني وضع الكود النموذجي في علامة التبويب JS بدلاً من الملفات؟
لقد أعطاني هذا الإصدار
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
class FirstPosts extends Component {
@tracked posts = [];
constructor() {
super(...arguments);
this.loadPosts();
}
async loadPosts() {
let topicIds = [123, 456]; // change to your topic IDs
let posts = [];
for (let id of topicIds) {
let res = await fetch(`/t/${id}.json`);
let data = await res.json();
if (data.post_stream && data.post_stream.posts.length > 0) {
posts.push(data.post_stream.posts[0]);
}
}
this.posts = posts;
}
static template = <template>
{{#each this.posts as |post|}}
<div class="first-post-preview">
<h4>{{post.topic_title}}</h4>
{{{post.cooked}}}
</div>
{{/each}}
</template>;
}
export default apiInitializer("0.11.1", api => {
api.renderInOutlet("discovery-list-container-top", FirstPosts);
});
وعندما نسخت الكود الذي به خطأ إلى ask discourse، أعطاني هذا الإصدار
import { apiInitializer } from "discourse/lib/api";
// Global data store (hacky, but works for the JS tab)
window.firstPostsData = [];
fetch("/t/123.json")
.then(r => r.json())
.then(data => window.firstPostsData.push(data.post_stream.posts[0]));
fetch("/t/456.json")
.then(r => r.json())
.then(data => window.firstPostsData.push(data.post_stream.posts[0]));
export default apiInitializer(api => {
api.renderInOutlet("discovery-list-container-top",
<template>
{{#each (theme-prefix "firstPostsData" window=true) as |post|}}
<div class="first-post-preview">
<h4>{{post.topic_title}}</h4>
{{{post.cooked}}}
</div>
{{/each}}
</template>
);
});
هل يمكن لأحد أن يخبرني ما الذي أفعله بشكل خاطئ؟
كان الخطأ في وحدة التحكم:
Compile error: SyntaxError: /theme-4/discourse/api-initializers/theme-initializer.gjs:
هذا ما ظهر في المعاينة
شكراً جزيلاً
إعجاب واحد (1)
لقد قمت بتعديله ويبدو أن هذا يعمل:
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
class FirstPosts extends Component {
@tracked posts = [];
constructor() {
super(...arguments);
this.loadPosts();
}
async loadPosts() {
let topicIds = [123, 456]; // غيّر إلى معرفات الموضوعات الخاصة بك
let posts = [];
for (let id of topicIds) {
const res = await fetch(`/t/${id}.json`);
const data = await res.json();
if (data.post_stream && data.post_stream.posts.length > 0) {
posts.push(data.post_stream.posts[0]);
}
}
this.posts = posts;
}
<template>
{{#each this.posts as |post|}}
<div class="first-post-preview">
<h4>{{post.topic_title}}</h4>
{{{post.cooked}}}
</div>
{{/each}}
</template>;
}
export default apiInitializer((api) => {
api.renderInOutlet("discovery-list-container-top", FirstPosts);
});
إعجاب واحد (1)
شكرًا لك نيت! أحاول معرفة ما الذي قمت بتغييره
يبدو أن الكود الخاص بك يطابق نسختي الأولى
لقد استبدلت let بـ const في حلقة التكرار for
هل هذا صحيح؟
إصدار ask discourse يرمي خطأ
for (let id of topicIds) {
let res = await fetch(`/t/${id}.json`);
let data = await res.json();
if (data.post_stream && data.post_stream.posts.length > 0) {
posts.push(data.post_stream.posts[0]);
}
}
إصدار نيت يعمل
for (let id of topicIds) {
const res = await fetch(`/t/${id}.json`);
const data = await res.json();
if (data.post_stream && data.post_stream.posts.length > 0) {
posts.push(data.post_stream.posts[0]);
}
}
هل يمكن لأي شخص أن يشرح ما هو الخطأ؟ لماذا لا يعمل Let ويعمل const؟
شكرًا مرة أخرى نيت
إعجاب واحد (1)
لقد جربت let وكانت النتيجة هي نفسها. الأمر هو أنني عادةً ما أستخدم const عند استخدام fetch() أو ajax().
أعتقد أن الخطأ يأتي من السطر static template =. باستخدامه، أحصل على:
[THEME 10283 'Pokemon Theme'] Error: connector component has no associated template. Ensure the template is colocated or authored with gjs.
at h (plugin-connectors.js:35:11)
at eY.renderInOutlet (plugin-api.gjs:1116:5)
at todo.gjs:43:7
at eH (plugin-api.gjs:3363:10)
at Object.initialize (api.js:21:14)
at i.initialize (app.js:265:28)
at index.js:379:19
at e.each (index.js:183:7)
at e.walk (index.js:112:10)
at e.each (index.js:59:20)
at e.topsort (index.js:65:10)
at iL._runInitializer (index.js:392:11)
at iL.runInstanceInitializers (index.js:377:10)
at l._bootSync (instance.js:116:22)
at iL.didBecomeReady (index.js:784:18)
at invoke (index.js:262:14)
at m.flush (index.js:180:11)
at g.flush (index.js:334:19)
at z._end (index.js:762:32)
at _boundAutorunEnd (index.js:499:12)
وإذا استخدمت <template> مباشرة، فلا يوجد خطأ.
إعجابَين (2)