[英]Wait for promise to resolve in Base View then continuing action in extended view?
我已經創建了一個擴展的基礎視圖,我想做的是在基礎中為選擇器設置動畫,並使用deferreds resolve並在擴展視圖中繼續執行其他操作,但是我不確定如何實現這一點? 現在,控制台會立即登錄when函數:/
JS
var ParentView = Backbone.View.extend({
template: Handlebars.compile( $('.tmpl-example').html() ),
initialize: function() {
},
render: function() {
this.$el.html( this.template() );
_.defer(function() {
this.afterRender();
}.bind(this));
return this;
},
afterRender: function() {
this.deferred = $.Deferred();
this.$('.js-panel').addClass('animate');
this.$('.js-panel').on('transitionend', function() {
this.deferred.resolve();
}.bind(this));
}
});
var ChildView = ParentView.extend({
initialize: function() {
$.when(this.deferred).done(function() {
console.log('now go do something???');
});
}
});
JSFiddle http://jsfiddle.net/jn35b8pw/
這里的問題是this.deferred
在ChildView中運行this.deferred
未定義。 它基本上在運行: $.when(undefined).done(function() { ... });
這就是為什么它立即執行。
您可以通過在ParentView的initialize函數中設置this.deferred
來獲得預期的行為:
var ParentView = Backbone.View.extend({
template: Handlebars.compile( $('.tmpl-example').html() ),
initialize: function() {
this.deferred = $.Deferred();
},
render: function() {
this.$el.html( this.template() );
_.defer(function() {
this.afterRender();
}.bind(this));
return this;
},
afterRender: function() {
this.$('.js-panel').addClass('animate');
this.$('.js-panel').on('transitionend', function() {
this.deferred.resolve();
}.bind(this));
}
});
只要確保在ChildView的initialize
函數中您正在調用“ super”即可:
var ChildView = ParentView.extend({
initialize: function() {
ParentView.prototype.initialize.call(this); // call super
$.when(this.deferred).done(function() {
console.log('now go do something???');
});
}
});
小提琴: http : //jsfiddle.net/zspxL3bd/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.