2012-01-31 49 views
0

在繼續KnockoutJS 1.2.1(無法切換到2,或相信我我會)中,我有一個非常奇怪的行爲。KnockoutJS渲染後從viewModel檢索數據

基本上,我在模板上設置了一個渲染後渲染。在渲染後,我需要從我的viewModel檢索數據。當我試圖通過render函數中的viewModel.stuff()從它獲取數據時,發生了一個strrrange行爲。它似乎在多次調用渲染或其他東西。

這裏是代碼...

var viewModel = { 
    stuff: ko.observableArray([{ id : 1, name : 'Thing'}, 
     { id: 2, name : 'Thingier' }, 
     { id : 3, name : 'Thingiest' }]) 

}; 

window.render = function(el){ 
    // This line does weird stuff!! 
    // Observe the console with and without it 
    // All I want to do is get my stuff... 
    var stuff = viewModel.stuff(); 
    console.log(el); 
}; 

var update = function(){ 
    console.log(viewModel); 
    viewModel.stuff.push({ id : 4, name : 'Thingiestest' });  
};  

$(function(){ 
    ko.applyBindings(viewModel); 

    $("#add").click(function(){ 
     update(); 
    }); 
}); 

這裏是小提琴...

http://jsfiddle.net/jcreamer898/wZ5bD/

剛剛嘗試註釋掉VAR東西= viewModel.stuff()在渲染功能並在單擊按鈕時觀察控制檯日誌中的差異。

欣賞這裏的任何幫助,因爲我知道這個有點奇怪!

回答

0

綁定在計算的observable內部執行,因此當您在afterRender函數中調用viewModel.stuff()時,您正在爲可觀察值的每個stuff創建一個依賴項。

添加新項目時,afterRender在再次渲染每個項目後會被調用。

看看這裏的日期:http://jsfiddle.net/rniemeyer/wZ5bD/4/

我不知道,你要完成的確切的事情,但如果你需要做的是在afterRender,不想依賴,那麼你可以執行你的動作在setTimeout 0. http://jsfiddle.net/rniemeyer/wZ5bD/5/

+0

你達人......謝謝!這有助於...... – jcreamer898 2012-01-31 21:17:34