ember-cli 渲染后如何触发元素特性
how to trigger element features after render in ember-cli
我想将工具提示添加到 组件 中的按钮上,该按钮可以根据从服务器返回的一组结果显示。 (即用于删除、编辑等的操作按钮)
我创建了一个呈现到应用程序中的“搜索”组件,当单击搜索按钮时,服务器可能 return 将许多行添加到同一搜索组件模板中。
例如:
My-app/pods/factual-data/template.hbs
包含:
…
{{#if results}}
<div class="row">
<div class="col-sm-3"><b>Factual ID</b></div>
<div class="col-sm-2"><b>Name</b></div>
<div class="col-sm-2"><b>Town</b></div>
<div class="col-sm-2"><b>Post Code</b></div>
<div class="col-sm-2"><b>Actions</b></div>
</div>
{{/if}}
{{#each result in results}}
<div class="row">
<div class="col-sm-3">{{result.factual_id}}</div>
<div class="col-sm-2">{{result.name}}</div>
<div class="col-sm-2">{{result.locality}}</div>
<div class="col-sm-2">{{result.postcode}}</div>
<div class="col-sm-2">
<button {{action "clearFromFactual" result.factual_id}} class="btn btn-danger btn-cons tip" type="button" data-toggle="tooltip" class="btn btn-white tip" type="button" data-original-title="Empty this Row<br> on Factual" ><i class="fa fa-check"></i></button>
</div>
</div>
{{/each}}
…
但是,由于元素插入 detection/timing 问题,我无法使工具提示代码起作用。
在组件
My-app/pods/factual-data/component.js
包含:
...
didInsertElement : function(){
console.log("COMPONENT: didInsertElement");
Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
this.enableToolTips();
},enableToolTips: function() {
var $el = Ember.$('.tip');
console.log("TOOLTIP:", $el);
if($el.length > 0) {
$el.tooltip({
html:true,
delay: { show: 250, hide: 750 }
});
}
}
...
然而似乎 didInsertElement 只是 运行 当组件首次渲染时,是否有不同的功能是每当组件中 DOM 中的某些内容发生更改时调用?
我确实尝试使用观察:即
…
enableToolTips: function() {
var $el = Ember.$('.tip');
console.log("TOOLTIP:", $el);
if($el.length > 0) {
$el.tooltip({
html:true,
delay: { show: 250, hide: 750 }
});
}
}.observes('results')
…
当结果变量改变时它会触发,但它仍然在内容实际呈现之前触发。我假设这是因为我在控制台中手动 运行 Ember.$('.tip').tooltip() (在显示按钮之后)然后工具提示工作正常。
关于这个问题的任何指示?
尝试
enableToolTips: function() {
Ember.run.scheduleOnce('afterRender', this, function() {
var $el = Ember.$('.tip');
console.log("TOOLTIP:", $el);
if($el.length > 0) {
$el.tooltip({
html:true,
delay: { show: 250, hide: 750 }
});
}
});
}.observes('results')
检查 Ember.Component API 有两个钩子可以做到这一点
willClearRender : 当组件 html 即将发生变化时。
willInsertElement : 当清除旧的 html 并放置新的时。
但是你需要看看scheduleOnce。
值得注意的是,每次 didInsertElement 运行s。但是当它 运行s 视图没有更新时。要解决这个问题,你需要 运行 你的代码在 Run Loop 中,像这样
didInsertElement : function(){
var self = this;
Ember.run.scheduleOnce('afterRender', this, function(){
//run tool tip here
self.$().find(".tip").tooltip({
});
});
}
我想将工具提示添加到 组件 中的按钮上,该按钮可以根据从服务器返回的一组结果显示。 (即用于删除、编辑等的操作按钮)
我创建了一个呈现到应用程序中的“搜索”组件,当单击搜索按钮时,服务器可能 return 将许多行添加到同一搜索组件模板中。
例如:
My-app/pods/factual-data/template.hbs
包含:
…
{{#if results}}
<div class="row">
<div class="col-sm-3"><b>Factual ID</b></div>
<div class="col-sm-2"><b>Name</b></div>
<div class="col-sm-2"><b>Town</b></div>
<div class="col-sm-2"><b>Post Code</b></div>
<div class="col-sm-2"><b>Actions</b></div>
</div>
{{/if}}
{{#each result in results}}
<div class="row">
<div class="col-sm-3">{{result.factual_id}}</div>
<div class="col-sm-2">{{result.name}}</div>
<div class="col-sm-2">{{result.locality}}</div>
<div class="col-sm-2">{{result.postcode}}</div>
<div class="col-sm-2">
<button {{action "clearFromFactual" result.factual_id}} class="btn btn-danger btn-cons tip" type="button" data-toggle="tooltip" class="btn btn-white tip" type="button" data-original-title="Empty this Row<br> on Factual" ><i class="fa fa-check"></i></button>
</div>
</div>
{{/each}}
…
但是,由于元素插入 detection/timing 问题,我无法使工具提示代码起作用。 在组件
My-app/pods/factual-data/component.js 包含:
...
didInsertElement : function(){
console.log("COMPONENT: didInsertElement");
Ember.run.scheduleOnce('afterRender', this, this.afterRenderEvent);
this.enableToolTips();
},enableToolTips: function() {
var $el = Ember.$('.tip');
console.log("TOOLTIP:", $el);
if($el.length > 0) {
$el.tooltip({
html:true,
delay: { show: 250, hide: 750 }
});
}
}
...
然而似乎 didInsertElement 只是 运行 当组件首次渲染时,是否有不同的功能是每当组件中 DOM 中的某些内容发生更改时调用?
我确实尝试使用观察:即
…
enableToolTips: function() {
var $el = Ember.$('.tip');
console.log("TOOLTIP:", $el);
if($el.length > 0) {
$el.tooltip({
html:true,
delay: { show: 250, hide: 750 }
});
}
}.observes('results')
…
当结果变量改变时它会触发,但它仍然在内容实际呈现之前触发。我假设这是因为我在控制台中手动 运行 Ember.$('.tip').tooltip() (在显示按钮之后)然后工具提示工作正常。
关于这个问题的任何指示?
尝试
enableToolTips: function() {
Ember.run.scheduleOnce('afterRender', this, function() {
var $el = Ember.$('.tip');
console.log("TOOLTIP:", $el);
if($el.length > 0) {
$el.tooltip({
html:true,
delay: { show: 250, hide: 750 }
});
}
});
}.observes('results')
检查 Ember.Component API 有两个钩子可以做到这一点
willClearRender : 当组件 html 即将发生变化时。
willInsertElement : 当清除旧的 html 并放置新的时。
但是你需要看看scheduleOnce。
值得注意的是,每次 didInsertElement 运行s。但是当它 运行s 视图没有更新时。要解决这个问题,你需要 运行 你的代码在 Run Loop 中,像这样
didInsertElement : function(){
var self = this;
Ember.run.scheduleOnce('afterRender', this, function(){
//run tool tip here
self.$().find(".tip").tooltip({
});
});
}