1 回答
TA贡献1831条经验 获得超9个赞
在这里,您从您的计算属性返回一个承诺,它是一个对象,而不是一个字符串。
通常,在渲染您的组件之前,我们实际上不会等待 promise 解决。相反,我们先渲染一些东西(比如加载 gif),然后在 promise 解决后重新渲染图像。
这个问题有两种传统的解决方案。一种是在您的计算属性中使用 PromiseProxy。
return Ember.ObjectProxy.extend(Ember.PromiseProxyMixin).create({ promise });
您可以在模板中使用这样的代码:
{{#if image.baseUrl.isPending}}
<img src="loading.gif">
{{else}}
{{lazy-image url=(concat image.baseUrl.content) ...}}
{{/if}}
见https://api.emberjs.com/ember/release/classes/PromiseProxyMixin
第二种传统解决方案是使用ember-concurrency和避免返回承诺的计算属性。这涉及重写您的代码以使其更具必要性。
请参阅http://ember-concurrency.com/docs/introduction/
我通常更喜欢这种解决方案,因为使用 Promise 代理会变得复杂且难以理解。
此外,如果您使用的是更现代的 Ember 版本(2.10 或更高版本),您可以尝试ember-lifeline添加到项目中的代码量比添加到项目中的代码要少得多ember-concurrency,以及更简单的 API 足以满足此需求。(我根据您的代码示例假设您使用的是旧版本的 Ember,但使用的是现代浏览器。)请参阅https://ember-lifeline.github.io/ember-lifeline/
添加回答
举报