Проблема отображения нокаута с массивами

Скрипка здесь

У меня есть массив объектов, которые я хочу сопоставить непосредственно с коллекцией в моей модели представления, но я хочу настроить сопоставление. Однако код не работает, если в коллекции data.UserReports нет только одного элемента.

Я могу сделать это, если добавлю еще один слой в граф объектов, например, вместо сопоставления data.UserReports с моделью. через model.Foo.UserReports, но это нежелательно и грязно.

Я также считаю, что смогу сделать это, если я перебираю массив data.UserReports и по очереди помещаю каждый UserReport в коллекцию модели, но опять же это кажется неуклюжим.

Так что не так со скрипкой?


person BonyT    schedule 07.07.2012    source источник


Ответы (2)


Код в этой скрипке вообще не работает, по крайней мере, у меня. Но, тем не менее, вот как вы обычно используете подключаемый модуль сопоставления с существующим экземпляром модели представления:

function PageModel() { /* ... */ }

$(document).ready(function() {
    var model = new PageModel();

    // Don't replace some observable, but extend the view model automatically,
    // creating an observable for each property in "data".
    ko.mapping.fromJS(data, userReportMapping, model);

    ko.applyBindings(model);
}​);​

http://jsfiddle.net/Quu4f/27/


Обновление: вам также необходимо / следует указать, к какому ключу в объекте данных следует применить параметры сопоставления:

var userReportMapping = {
   'UserReports': {
        key: function(data) {
            return ko.utils.unwrapObservable(data.Id);
        },
        create: function(options) {
            return new userReportModel(options.data);
        }
    }
};

Однако немного странно, что вы получаете сообщение об ошибке, когда у вас есть два элемента с одинаковым идентификатором в наборе данных. Кажется, что обратный вызов «создать» не выполняется для дубликата, но обычный наблюдаемый объект все еще создается.

http://jsfiddle.net/Quu4f/29/

person Niko    schedule 07.07.2012
comment
не имеет значения с отображением, как показано - оно не работает так, как требуется - см. мой ответ выше для рабочего кода, который выполняет свою работу, но не является (imo) идеальным - person BonyT; 08.07.2012
comment
Извините, нужно быть яснее - конечно, код, который вы разместили, работает - проблема, с которой я борюсь, заключается в том, как настроить сопоставление для обработки массива. - person BonyT; 08.07.2012
comment
@BonyT Хорошо, не сразу понял. Нашел еще немного и обновил свой ответ, но я все еще не совсем уверен, что это то, что вы ищете сейчас. - person Niko; 08.07.2012
comment
Ах, у двух предметов должны быть разные ключи. Но спасибо — да, это недостающая часть — вы передаете коду отображения объект, содержащий массив, — и устанавливаете код отображения для обработки внешнего объекта. Идеально - спасибо за это. - person BonyT; 08.07.2012

Это делает это, перебирая массив и помещая каждый элемент по очереди в наблюдаемую коллекцию - есть ли лучший способ?

person BonyT    schedule 07.07.2012