7

我正在使用Knockout實現課程列表選擇工具。我正在使用下面的方法來填充數據(MVC3/Razor),這樣當視圖模型最初被填充時,我對每個KO數組(即CourseList,ScheduleList)都沒有問題。但是,當來自服務器的初始負載返回零行時,意味着視圖模型'ScheduleList'屬性爲空,則無法調用任何方法,如.push()或.removeAll()。據推測,這意味着可觀察陣列從未被創建,因爲沒有什麼可以填充它。填充模型時,ScheduleList屬性將填充List。當MVC操作將其返回爲空時,實例化它的最佳方式是什麼?有一個似乎解決它的jsFiddle,但是當我嘗試使用「創建」選項時,它會將我的整個模型呈現爲空白。我不確定'創建'選項的語法是什麼。該的jsfiddle是在這裏:http://jsfiddle.net/rniemeyer/WQGVC/初始視圖模型加載爲空時如何初始化Knockout視圖模型

// Get the data from the server 
var DataFromServer = @Html.Raw(Json.Encode(Model));  

// Data property in viewmodel 
var data = { 
    "CourseList": DataFromServer.CourseList , 
    "ScheduleList": DataFromServer.ScheduleList 
    }; 

$(function() { 
    // Populate Data property 
    viewModel.Data = ko.mapping.fromJS(data); 

    // ko.applyBindings(viewModel, mappingOptions);    
    ko.applyBindings(viewModel); 
}); 

當初始頁面加載不填充ScheduleList,然後將下面的代碼拋出一個錯誤。如果初始頁面加載包含的數據,那麼你可以調用.removeAll()和.push()等

var oneA= 'abc'; 

// push not working     
this.Data.ScheduleList.push(oneA); 

回答

9

設置你的映射參數,使其等創作,你給它一定的結構體。然後它會爲你做更新。

最有可能發生的事情是您的DataFromServer實際上並不包含ScheduleList屬性。所以當它被映射時,相應的屬性是不會被創建的。該映射器只會將現有屬性映射到observables。

您需要在視圖模型的create選項中設置爲在未設置任何數組時添加空數組。那樣的話,你的視圖模型將會以相應的可觀察數組結束。

通過確保CourseListScheduleList是一個數組,映射視圖模型會將它們映射爲observableArray對象,以便您的代碼將按預期工作。

var DataFromServer = { 
    'CourseList': [1,2,3] 
    //, 'ScheduleList': [] 
}; 

var dataMappingOptions = { 
    'create': function (options) { 
     var data = options.data; 
     data.CourseList = data.CourseList || []; 
     data.ScheduleList = data.ScheduleList || []; 
     return ko.mapping.fromJS(data); 
    } 
}; 

viewModel.Data = ko.mapping.fromJS(DataFromServer, dataMappingOptions); 
+0

謝謝!這正是發生的情況,並解決了這個問題。有趣的是,我看到的大多數jsFiddles都是在屬性(數組本身)上進行操作,所以我沒有嘗試過創建回調。 Ray建議的另一種方法也適用。 –

1
var data = { 
    CourseList: DataFromServer.CourseList || ko.observableArray([]) , 
    ScheduleList: DataFromServer.ScheduleList || ko.observableArray([]) 
    };