Проблем с картографирането на нокаут с масиви

Fiddle тук

Имам масив от обекти, които искам да картографирам директно в колекция на моя изгледмодел, но искам да персонализирам картографирането. Кодът обаче не работи, освен ако няма само един елемент в колекцията data.UserReports.

Мога да го направя, ако добавя друг слой в графиката на обекта - така например вместо да картографирам data.UserReports към model.UserReports - ако имах свойство на модела, наречено Foo - мога да картографирам данни към foo и след това да получа достъп до колекцията чрез 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);
        }
    }
};

Въпреки това е малко странно, че получавате грешка, когато имате два елемента с еднакъв идентификатор в набора от данни. Изглежда, че обратното извикване "create" не се изпълнява за дубликата, но все още се създава нормален наблюдаем.

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