如何在knockout中将对象数组添加到observable数组中?

8 knockout.js

我通过ajax获取大量对象,如果数组有数据,那么它将传递给我的viewmodel中的ImportObservableListItems:

        success: function (data) {
            debugger 
            if (data.length > 0) {

            ReadingList.ImportObservableListItems(data);

            } 
Run Code Online (Sandbox Code Playgroud)

在viewmodel中我想将每个对象添加到一个可观察的数组中,但我需要每个对象的属性都是可观察的.但是如果数组包含大量对象,则浏览器崩溃.有什么方法可以阻止它吗?

self.ImportObservableListItems = function (data) {
            $.each(data, function(index, item) {
                var newListItem = {
                    MediaID: ko.observable(item.MediaID),
                    MediaName: ko.observable(item.MediaName),
                    MediaTypeID: ko.observable(item.MediaTypeID),
                    MediaTypeName: ko.observable(item.MediaTypeName),
                    Group1: ko.observable(item.Group1),
                    Group2: ko.observable(item.Group2),
                    Group3: ko.observable(item.Group3),
                    Group4: ko.observable(item.Group4),
                    Group5: ko.observable(item.Group5)
                };
                ReadingList.ReadingListItems.push(newListItem);
            });
        };
Run Code Online (Sandbox Code Playgroud)

Bra*_*don 23

您可以通过一次推送所有项目来减少流失(推送接受多个项目):

var items = $.map(data, function (item) {
    return {
        MediaID: ko.observable(item.MediaID),
        MediaName: ko.observable(item.MediaName),
        MediaTypeID: ko.observable(item.MediaTypeID),
        MediaTypeName: ko.observable(item.MediaTypeName),
        Group1: ko.observable(item.Group1),
        Group2: ko.observable(item.Group2),
        Group3: ko.observable(item.Group3),
        Group4: ko.observable(item.Group4),
        Group5: ko.observable(item.Group5)
    };
});

ReadingList.ReadingListItems.push.apply(ReadingList.ReadingListItems, items);
Run Code Online (Sandbox Code Playgroud)

这将导致在添加所有项目时仅发出一个通知,而不是每个项目一次.