Отображение нокаута с добавлением функции

Я пытаюсь добавить функцию к кнопке в моей форме. Я продолжаю получать сообщение о том, что alertMe не определен.

Я попытался объявить свое сопоставление как таковое:

$(function () {

        var mapping = {
            create: function (options) {
                return new CsvImportItem(options.data);
            },
            alertMe: function () {
                alert('Here we go');
            }
        }


        var CsvImportItem = function (data) {
            ko.mapping.fromJS(data, {}, this);

            this.rowClass = ko.computed(function () {
                if (this.Accepted()) return 'success'; else return 'error';
            }, this);

            this.acceptItem = function () {
                this.Accepted(true);
            };

            this.declineItem = function () {
                this.Accepted(false);
            };

        }
        var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), mapping);

        ko.applyBindings(viewModelJSON);
    });

Если я изменю viewModelJSON на:

var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), {}, mapping);

то вызов функции alertMe работает, а остальные элементы отображения — нет. Любые мысли о том, что я делаю неправильно?

Обновить, чтобы показать структуру данных

Моя структура данных, поступающая в представление, имеет тип

IEnumberable<Project.Namespace.CsvImportItem>

Поэтому я получаю такую ​​​​структуру:

[
 {CsvImportItem},
 {CsvImportItem},
 {CsvImportItem}
]

person mcbowes    schedule 27.11.2012    source источник
comment
Почему вы хотите, чтобы сопоставление добавляло alertMe? Зачем просто помещать определение alertMe в объект CsvImportItem?   -  person nemesv    schedule 27.11.2012
comment
Я хочу, чтобы функция работала с коллекцией CsvImportItems, а не с экземпляром 1 CsvImportItem, как мои функции rowClass, acceptItem и rejectItem. Я обновлю свой пост, чтобы сделать мои данные более четкими.   -  person mcbowes    schedule 27.11.2012


Ответы (1)


Вы пытаетесь применить сопоставление json к объекту сопоставления, правильный синтаксис

var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), mapping);

Также пропустите сопоставление, оно не требуется для простых сценариев, подобных этим.

ko.applyBindings(new CsvImportItem($.parseJSON('@Html.Raw(jsonData)')));
person Anders    schedule 27.11.2012
comment
CsvImportItem не является родительским классом, скорее мои данные представляют собой набор CsvImportItems, которые я успешно объявил функциями для каждого экземпляра (rowClass, acceptItem и rejectItem. Я пытаюсь запустить функцию для всей коллекции CsvImportItems, это предшественник для отправки набора результатов на мой контроллер. - person mcbowes; 27.11.2012
comment
Окей, тогда вы должны сделать это, как в первом примере кода в моем ответе, ваш пример кода пытается сопоставить данные JSON с объектом сопоставления, что неверно. т.е. заменить {} на сопоставление - person Anders; 27.11.2012
comment
Спасибо за ответ. Я уже вызываю код var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), mapping); Я просто поставил второй способ, который я пробовал, как дополнительную информацию. По какой-то причине alertMe работает, если я использую второй фрагмент кода, но больше ничего не работает. Странный. Я работаю над сбором скрипки. - person mcbowes; 27.11.2012
comment
Почему у вас есть предупреждение об объекте сопоставления? Он должен быть там, объект сопоставления — это просто вспомогательный объект для плагина сопоставления. - person Anders; 27.11.2012
comment
Его там быть не должно, извините за опечатку - person Anders; 27.11.2012
comment
Мне просто не хватает, как получить функцию в коллекции. Я пытаюсь поднять предупреждение, чтобы посмотреть, работает ли оно, и собираюсь использовать функцию для отправки обратно на мой контроллер. У меня есть JSBin, работающий как испытательный стенд, я не могу понять, как добавить функцию (в моем тесте простое предупреждение) и привязать ее к нажатию кнопки отправки. jsbin.com/ijibim/1/edit - person mcbowes; 27.11.2012
comment
Чтобы отправить его обратно, вы можете просто сделать ko.toJS, если вы используете jQuery для публикации ajax, обязательно установите формат данных JSON для публикации, иначе jQuery по умолчанию будет формировать формат публикации, который контроллер MVC не поймет, как декодировать - person Anders; 27.11.2012