2016-01-23 43 views
0

只是想知道如何處理「稍後調用」,當需要在外部作用域中引用「this」時。根據idomatic.js,Aliase似乎不是很好的做法。我引述:這種方式來綁定這個在Ember中的稍後調用

超越呼叫一般是衆所周知的使用情況和應用, 總是喜歡.bind(本)或同等功效,用於創建以後調用 BoundFunction定義。當沒有可用的選項時,只能使用 別名。

那麼在Ember中有沒有自以爲是的方式?例如:

export default Ember.Route.extend({ 
    model() { 
    return new Ember.RSVP.Promise(function(resolve) { 
     Ember.run.later(function() { 
     resolve({ msg: 'Hold Your Horses' }); 
     }, 3000); 
    }); 
    }, 

    setupController(controller, model) { 
    console.log(model.msg); // "Hold Your Horses" 
    } 
}); 

如果在Ember.run.later()我想this解決後做一些事情:

this.controllerFor("application").set("dataReady", true); 

例如。

我想,用aliase that是:

model() { 
    let that = this; 
    return new Ember.RSVP.Promise(function(resolve) { 
     Ember.run.later(function() { 
     that.controllerFor('application').set('dataReady', true); 
     resolve({ msg: 'Hold Your Horses' }); 
     }, 3000); 
    }); 
    }, 

但有什麼更好的辦法?

+0

那麼,爲什麼不使用bind(this)呢? –

+0

沒有原因。只是想知道Ember是否有自己的方式。 – Hao

回答

0

除了使用別名,您可以使用arrow functions來維護範圍。沿着這些線路的東西應該工作:

model() { 
    return new Ember.RSVP.Promise((resolve) => { 
    Ember.run.later(this, function() { 
     this.controllerFor('application').set('dataReady', true); 
     resolve({ msg: 'Hold Your Horses' }); 
    }, 3000); 
    }); 
}, 

注意,傳遞給Ember.run.later回調並不需要是一個箭頭的功能,因爲你可以pass an object as the first argument of Ember.run.later到的環境中使用。

+0

Ember是否提供瀏覽器支持箭頭功能?該鏈接表示,Safari和IE不支持箭頭功能。 – Hao

相關問題