2013-10-20 38 views
2

我正在將控制器傳遞給emberjs component。控制器有一個名爲dateArray的計算屬性,該屬性包含一組日期。點擊一個#linkTo指向預約模板後,我可以進入控制檯,並做到:Emberjs-1.0控制器中的組件和計算屬性

b = App.__container__.lookup("controller:appointment") 
    c = b.get('dateArray') 
    and it returns [Array[2]] 

然而,當我通過該控制器爲emberjs組件

 {{date-picker datePickerController=controller}} 

在組件內部,我可以得到正確的控制器實例,使用下面的代碼

datePicker = _this.get('datePickerController'); 
console.log(datePicker), shows the dateArray with its content. 

但數組顯示爲空,當我基於上面的實例使用下面的代碼發現它時。

controllerContent = datePicker.get('dateArray'); 

但是如果我添加dateArray在約會模板車把表情,這使得它的內容:

{{dateArray}} 

那麼,爲什麼它的dateArray裏面空空如也emberjs組件當控制器實例emberjs組件dateArray

控制器:

App.AppointmentController = Ember.ObjectController.extend({ 
    needs: [ 'timeSlot'], 
    timeSlotController: Ember.computed.alias('controllers.timeSlot'), 
    dateArray: function(){ 
    _this = this; 

    fetchDates = [ ]; 

    var aa = _this.get('content'); 

    var yy = aa.get('timeSlots') 

    yy.then(function(hh){ 
     nn = hh.map(function(item){ return moment.utc(item.get('startTime')).format("YYYY-MM-DD"); }); 

    pp = fetchDates.pushObjects([nn]); 

    return nn; 
    }); 

    return fetchDates; 
    }.property('[email protected]') 


}); 

的emberjs組件:

App.DatePickerComponent = Ember.Component.extend({ 
    datePickerController: null, 

    didInsertElement: function() { 
    this._super(); 
    _this = this; 
    var datePicker; 

    datePicker = _this.get('datePickerController'); 
    //console.log(datePicker); 

    var controllerContent = datePicker.get('dateArray');  

    //returns nil 
    alert(controllerContent); 

    });// closes didInsertElement 

    } 

}); 
+0

如果添加breakpointinto的dateArray計算的屬性,當你調用此線路上再次得到它被擊中的:var controllerContent = datePicker.get('dateArray'); – Kingpin2k

回答

3

你的問題是你的dateArray屬性是異步的,因爲你正在使用yy.then

這是發生了什麼:

你叫datePicker.get('dateArray')這觸發yy.then但並不immediatelly解決,返回fetchDates爲空數組。當加載yy.then時,它將使用fetchDates.pushObjects([nn])填充數組,以便更新模板。

,我建議你去觀察數組中的變化來進行你想要什麼:

App.DatePickerComponent = Ember.Component.extend({ 
    datePickerController: null, 
    dateArrayChanged: function() { 
    var dateArray = this.get('datePickerController.dateArray'); 
    // now date array have elements 
    }.observes('datePickerController.dateArray.[]') 
}); 
+0

感謝@Márcio爲您提供有益的解釋。你是正確的,因爲我現在可以從** dateArrayChanged **中獲取數組。你有什麼建議,爲什麼從裏面** dateArrayChanged **更新的** dat函數**包含日期返回** undefined **。它們都是在這個** [jsfiddle](http://jsfiddle.net/Xajsr/2/)中的** DatePickerComponent **中定義的** – brg

+0

在dat函數中使用b = this.get('datePickerController。 dateArray');不要忘了使用get和set來讀取/更新燼對象的屬性 – Edu

+0

@Edu,謝謝你的建議。我仍然有一個問題,在** didInsertElement **中調用** alert **(this.dat()); **,仍然返回未定義的事件,儘管在** dat函數內或方法**,我** ** alert(this.get('datePickerController.dateArray'))**它返回正確的東西。這裏是一個** [更新的jsfiddle](http://jsfiddle.net/Xajsr/3/)**。在datePicker組件中,** dat函數**是在** didInsertElement **之後定義的。謝謝。 – brg

1

在餘燼控制器是一個奇怪的事情來繞過,它只是一個裝飾過的模型,如果你的模型修改下面的你的控制器控制器可能完全不同(也許這就是你的意圖)。您可以嘗試將dateArray傳入組件。

+0

這個工作通過在組件的模板上顯示,但是,我正在使用這個** a。forEach(function(item){return item;}); **試圖在組件本身中遍歷它並且它仍然是未定義的。任何建議 – brg