Как создать пользовательскую модель в Qooxdoo? (для списка)

Я пытаюсь сделать свою собственную модель, но я не знаю, как это сделать.

Я просматривал демонстрацию ListControllerWithObjects, но вижу только:

var person = new demobrowser.demo.data.model.Person(); 

но не показывайте, откуда оно берется и как делается. Так что этот урок бесполезен.

Почему я хочу индивидуальную модель? Я хочу иметь собственный класс только для модели, знать структуру и помещать в нее собственные методы.

У меня есть 2_

И я хочу внести его в список, но с помощью этого

var model = this._model = new qx.data.Array([{id: 1, name: "Victor"}]);    
this._listController = new qx.data.controller.List(model, this._list, 'name');

не работает. Настоящая ошибка — SingleValueBinding:

Свойство привязки + имя свойства + объекта + источник + невозможно: нет доступных событий. ;

Он не может найти событие.

Ошибка в консоли:

Uncaught qx.core.AssertionError: ошибка


person Totty.js    schedule 09.03.2012    source источник
comment
Кросс-пост из списка рассылки qooxdoo, qooxdoo.678.n2.nabble.com/   -  person ThomasH    schedule 10.03.2012


Ответы (2)


Ответ на первый вопрос здесь:

https://github.com/qooxdoo/qxl.demobrowser/blob/master/source/class/qxl/demobrowser/demo/data/model/Person.js

Этот файл содержит определение отсутствующего класса Person.

person Bart Jolling    schedule 14.07.2013
comment
Спасибо ... Я не могу подтвердить, что это работает, потому что я ухожу из qooxdoo, но я приму этот ответ, поскольку это было то, что я хотел в то время. - person Totty.js; 15.07.2013

Используйте qx.data.marshal.Json.createModel

-> Ваш код должен выглядеть так:

var model = this._model = qx.data.marshal.Json.createModel([{id: 1, name: "Victor"}]);    
this._listController = new qx.data.controller.List(model, this._list, 'name');

-> Сопоставление двух элементов модели с одним и тем же свойством ("a" и "secondA"):

var data = [{a: 2, b: 4}, {secondA: 1, b: 9}];
var delegate = {
    getPropertyMapping : function(property, properties) {
        if (property === "secondA") {
            return "a";
        }

        return property;
    }
};

var marshaler = new qx.data.marshal.Json(delegate);
marshaler.toClass(data);
var model = marshaler.toModel(data);

this.assertEquals("2", model.toArray()[0].getA());
this.assertEquals("1", model.toArray()[1].getA());

Взгляните на на моем примере Playground или модульный тест маршалера JSON (ищите "testGetPropertyMapping")

person Sandro    schedule 24.05.2012
comment
Я не понимаю, как qooxdoo присваивает имя модели на основе модели, которую вы указали в примере. Что, если бы у меня было 2 модели с одинаковыми данными, но с разными именами? как бы это отображало их? странно, но спасибо за ответ - person Totty.js; 25.05.2012
comment
Имя модели основано на хэше ключей модели. Вы можете использовать demo.qooxdoo.org/current/apiviewer // для установки явного класса модели на основе заданных свойств (IMarshalerDelegate#getModelClass()). - person Sandro; 25.05.2012
comment
Можете ли вы привести пример того, как это сделать на самом деле, из API я не могу понять, как это сделать .. спасибо ;) - person Totty.js; 16.07.2012
comment
@Totty, я обновил свой ответ. Обратите внимание, я не тестировал картографию, так как у меня нет среды qx atm, поэтому может потребоваться некоторая настройка ;-), но вы должны уловить основную идею. - person Sandro; 17.07.2012
comment
@Totty, этот пример с игровой площадкой работает как чудо (вы должны открыть панель журнала, чтобы увидеть результат): goo. gl/QYqgC - person Sandro; 17.07.2012