2013-12-18 31 views
1

我需要保存到本地存儲,「savedData」中的數據,以更新目前是空的視圖模型網頁時再談/刷新,可能使用KO映射插件中線:更新KnockoutJS視圖模型使用了配置和localStorage的保持持久

ko.mapping.fromJS(this, retrievedData); 

但當然它不工作!

function viewModel() { 

    var self = this; 

    self.employees = ko.observableArray([]); 

    self.removeEmployee = function (employee) { 
     self.employees.remove(employee); 
    }; 

    self.addEmployee = function() { 
     self.employees.push(new Employee()); 
    }; 

    self.save = function() { 
     var savedData = ko.toJSON(this); 
     localStorage.setItem('savedData', savedData); 
     //console.log('savedData', JSON.parse(savedData)) 
    } 

    if (localStorage && localStorage.getItem('savedData')) { 
     var retrievedData = JSON.parse(localStorage.getItem('savedData')); 
     ko.mapping.fromJS(this, retrievedData); 
    } 
} 

var vm = new viewModel(); 
ko.applyBindings(vm); 

回答

1

問題出在fromJS參數。第二個參數是映射選項,但你試圖通過數據來代替。正確使用應當以下

var viewModel = ko.mapping.fromJS(retrievedData, mappingOptions); 

如果你不使用mappingOptions

ko.mapping.fromJS(retrievedData, {}, viewModel); 

這將您的數據轉換爲viewModel沒有任何具體的映射選項要地圖retreivedDataviewModel


注:如果調用 mapping.fromJS有兩個參數,並 second argument IS mapping object (__ko_mapping__ property defined)它將把第二個參數作爲 viewModel,你可以以不同的方式使用功能:

ko.mapping.fromJS(retrievedData, viewModel); 

基本上這種情況下是有效的,當你不創建viewModel,而是更新以前CREA門使用映射viewModel一些數據。


答:你應該傳遞空options參數正確地更新你的代碼共地圖。當然數據應該是第一個:

if (localStorage && localStorage.getItem('savedData')) { 
    var retrievedData = JSON.parse(localStorage.getItem('savedData')); 
    ko.mapping.fromJS(retrievedData, {}, self); 
} 
+0

啊啊,開關一個roo!謝謝!我不得不重新添加到數據綁定$父,以獲得點擊功能工作,但比所有其他的好! – hotdiggity