我正在填充一个空列表对象
<ul id="results"></ul>
通过Turbostream请求
# myaction.turbo_stream.erb
<%= turbo_stream.append "results" do %>
<li data-mystimulus_target="item">HELLO WORLD</li>
<% end %>
我通过fetch API从一个刺激控制器发出请求,我想在新的item
目标被附加到DOM后与它们交互。
// mystimulus_controller.js
static targets = ["item"]
connect() {
fetch(this.myRequest())
.then(response => {
if (response.ok) {
return response.text()
}
throw response.status
})
.then(html => {
Turbo.renderStreamMessage(html)
// immediate
console.log("immediate has items check", this.hasItemTarget))
// delayed
this.delay(1000).
then(() => console.log("delayed has items check", this.hasItemTarget))
})
.catch(error => console.warn(error))
}
myRequest() {
return new Request("myurl", {
method: "GET",
headers: {
Accept: "text/vnd.turbo-stream.html"
},
redirect: "manual"
});
}
delay(milliseconds){
return new Promise(resolve => {
setTimeout(resolve, milliseconds);
});
}
console.log("immediate has items check", this.hasItemTarget))
返回falseconsole.log("delayed has items check", this.hasItemTarget))
返回trueTurbo.renderStreamMessage
看起来是异步的,但是在深入研究之后,我没有发现这个函数公开的任何回调或promise。
有没有更好的方法来确保Turbo.renderStreamMessage
在继续之前已经完成(我想摆脱我的delay()
函数)。
1条答案
按热度按时间eblbsuwk1#
这里的Turbo流只做了一个简单的
append
,如果你想做一些更复杂的事情,也许自定义turbo流操作会是一个更好的选择:您可以使用刺激目标回调来了解何时插入元素:
添加到刺激控制器:
您可以随时添加自己的观察者:
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
此外,不要低估涡轮增压框架,它可以为您做一些工作:
最好在请求位置有一个匹配的
turbo-frame
,但这样也可以:只是不要做得太过: