我有一个显示对象值的组件。
此对象将Ember.$.ajax
加载到strings
因为strings
是异步加载和/或可以在运行时更改(不是在此示例中),所以我使用.done()
来获取我需要的值。
一个简单的模板可以正常工作
{{u-string name="test_value"}}
但是如果嵌套{{u-string}}
的组件为{{yield}}
s,
它不会更新模板。
{{#u-button}}
{{u-string name="test_btn"}}
{{/u-button}}
这是我的简化组件代码:
import Ember from 'ember';
var strings = Ember.$.ajax({
url: '/api/strings'
});
export default Ember.Component.extend({
tagName: 'span',
value: '?',
count: null,
willInsertElement: function() {
console.log("Strings wait for \"" + this.get('name') + "\"");
strings.done((value) => {
Ember.run(() => {
var s = value[this.get('name')] || this.get('name');
console.log("Strings got \"" + s + "\" for \"" + this.get('name') + "\"");
this.set('value', s);
});
});
}
});
以下是我的{{u-string}}
模板:
{{value}}
如果我transitionTo
它将正确显示文本,但是当我直接访问页面(或刷新)时,它不会。
根据{{1}}和调试,console.log
设置正确,但模板无法更新。
我做了一些根本错误的事情还是应该这样做?
以后是否可以使用value
(通过异步回调)?
如果不是,我将如何更新我的组件值?
答案 0 :(得分:0)
我认为您的问题不是来自Ember观点的代码的整体功能,而是this
Ember.run()
部分willInsertElement
中的self
没有引用组件。
您有两种方法可以解决这个问题:
this
)来保存this
的值,该值可以在另一个内部访问"内部"功能。bind
更改willInsertElement: function() {
var self = this;
console.log("Strings wait for \"" + this.get('name') + "\"");
strings.done(function (value){
Ember.run(function(){
var s = value[self.get('name')] || self.get('name');
console.log("Strings got \"" + s + "\" for \"" + self.get('name') + "\"");
self.set('value', s);
});
});
}
所指的内容。选项1:
willInsertElement: function() {
console.log("Strings wait for \"" + this.get('name') + "\"");
strings.done(function (value){
Ember.run(function(){
var s = value[this.get('name')] || this.get('name');
console.log("Strings got \"" + s + "\" for \"" + this.get('name') + "\"");
this.set('value', s);
}.bind(this));
}.bind(this));
}
选项2:
trim()
答案 1 :(得分:0)
解决了这个问题,
第三方图书馆改变了dom的结构
{{u-button}}
..