2014-02-13 56 views
1

我已經在頁面上設置了以下用於更改學期的選擇。當選擇檢測到更改時,將觸發changeSemesters函數,該函數運行AJAX,該頁面將使用特定於所選學期的數據替換頁面上的當前數據。KnockoutJS在設置默認值後選擇啓動更改

查看

<select data-bind="options: semestersArr, optionsText: 'name', optionsValue: 'id', value: selectedSemester, event: { change: changeSemesters }"></select> 

視圖模型

this.selectedSemester = ko.observable(); 

//runs on page load 
var getSemesters = function() { 
    var self = this, current; 

    return $.get('api/semesters', function(data) { 
    self.semestersArr(ko.utils.arrayMap(data.semesters, function(semester) { 
     if (semester.current) current = semester.id; 
     return new Model.Semester(semester); 
    })); 

    self.selectedSemester(current); 
    }); 
}; 

var changeSemesters = function() { 
    // run ajax to get new data 
}; 

的問題是,在選擇觸發更改事件的changeSemester功能在頁面加載時,並設置爲默認值。沒有使用按鈕可以避免這種情況嗎?

回答

5

一般要在這些情況下做的是使用manual subscription,這樣就可以在觀察到的變化作出反應,而不是改變event。觀察對象只會在其值發生變化時纔會通知。

所以,你會怎麼做:

this.selectedSemester.subscribe(changeSemesters, this); 

如果selectedSemester作爲約束得到的結果仍然是不斷變化的,那麼你可以將其初始化爲默認值。

this.selectedSemester = ko.observable(someDefaultValue); 
+0

對不起,我昨天接受了這個,但我半睡半醒。我嘗試了你的第二種方法,但我不能用默認值初始化observable,因爲我等待在Ajax調用後獲取該值。如果我在那裏做init,'subscribe'會返回一個錯誤。我在這裏設置了一個小提琴:http://jsfiddle.net/hqH7K/ – Norbert

+0

正如你所看到的,在數值加載之後,'selectedSemester'在瞬間變成10,因爲這是select中的第一個選項值。有沒有辦法讓選擇忽略初始化過程並觸發用戶選擇?使用按鈕可以解決問題,但我正在嘗試構建選擇而無需使用一個按鈕。 – Norbert

+0

@Norbert - 你能從小提琴中澄清你的問題嗎?看起來它是不確定的,直到你的選擇回來。 –