Расширение динамических и сопоставленных данных в Knockout

Используя Knockout.JS, я пытаюсь определить, как лучше всего расширять объекты в модели представления, когда они будут загружаться через подключаемый модуль сопоставления и динамически добавляться. В этом примере я добавляю метод addChild к объекту Person.

Расширение во время отображения:

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

        this.addChild = function () {
            this.children.push(new Child());
        } .bind(this);
    }

    var mapping = {
        'people': {
            create: function (options) {
                return new myPersonModel(options.data);
            },
        }
    }

    var viewModel = ko.mapping.fromJS(data, mapping);

Расширение во время динамического создания:

    function Person(id, name, children) {
        this.id = ko.observable(id);
        this.name = ko.observable(name);
        this.children = ko.observable(children);
        this.addChild = function () {
            this.Forms.push(new Child());
        } .bind(this);
    }

Но мне кажется, что должен быть более простой способ сделать это, чтобы мне не нужно было повторяться, и как сопоставленные, так и новые объекты получали метод addChild.


person Joe    schedule 31.08.2012    source источник
comment
@ДжимГ. Я сделал опечатку и имел в виду метод addChild (исправлено). И я не уверен, как реализовать ваше предложение. Это то, с чем вы могли бы помочь?   -  person Joe    schedule 05.09.2012


Ответы (1)


Взгляните на этот ответ, особенно на живой пример на JSFiddle.

Похоже, ваш код близок к тому, что ему нужно.

Я думаю, вам просто нужно сложить mapping и ko.mapping.fromJS в свой конструктор Person.

person Jim G.    schedule 04.09.2012
comment
Вот скрипт с рабочей версией: jsfiddle.net/vDjwp Хотя решение было немного сложнее, вы вел меня в правильном направлении. - person Joe; 05.09.2012
comment
@Джо: Отлично! Рад, что смог помочь! - person Jim G.; 05.09.2012