簡體   English   中英

Ember.js:控制器何時可以訪問模型?

[英]Ember.js: When is a model accessible to the controller?

在Ember中,控制器什么時候可以訪問模型?

下面是一個簡單的Ember應用程序,它具有靜態模型和一個控制器,該控制器嘗試在init上訪問該模型。 您會注意到,在init ,模型title屬性是undefined 但是,setTimeout說明以后可以訪問該model

我的印象是,在模型准備就緒之前,Ember不會啟動控制器。 這個對嗎? Ember文檔( http://emberjs.com/guides/routing/specifying-a-routes-model/ )指出,即使實例化控制器時,即使異步加載,模型也可用。

http://jsfiddle.net/vu263uwq/1/

App = Ember.Application.create({});

App.IndexRoute = Ember.Route.extend({
    model: function() {
        return posts[0];
    }
});

App.IndexController = Ember.ObjectController.extend({
    alertTitle: function() {
        var that = this;

        jQuery(".output").append("1. "+this.get("title")+"<br />"); //Returns "undefined"

        setTimeout(function() {
            jQuery(".output").append("2. "+that.get("title")); //Returns the correct title
        }, 1000);
    }.on("init")
});

var posts = [
    {
        id: 1,
        title: "First title",
        body: "Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam."
    },{
        id: 2,
        title: "Second title",
        body: "Maecenas faucibus mollis interdum. Vestibulum id ligula porta felis euismod semper. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."
    }
];

您的印象實際上是錯誤的。 setupController掛鈎是您在控制器上設置任何屬性(包括模型)的位置。 實際上,默認情況下,所有setupController所做的都是在控制器上設置模型。 這就是為什么如果您重寫該掛鈎並仍然需要model集,則必須顯式設置模型或調用this._super(controller, model)

注意setupController的簽名:

setupController: function(controller, model)

為了使它起作用,必須已經在Ember設置模型的位置實例化了控制器。 在控制器的實例化過程中會觸發Init。 因此,在設置model之前會調用init

對於模型的異步獲取,如果您的模型鈎子返回了一個Promise,Ember將阻塞,直到可以將一個已實現的setupController傳遞到setupController函數中,以便將模型分配給Promise的Promise,而不是Promise本身。 它使您避免像這樣的呼叫:

setupController: function(controller, model){  
   var self = this;
   makeAsyncCallReturningPromise().then(function(result){
       self._super(controller, result);
   }
}

基本上可以完成同樣的事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM