bem / bem-mvc

Yet another MVC for i-bem
30 stars 27 forks source link

Не подхватываются поля с type: 'id' в модели при установке поля с type: 'model' #152

Closed ghost closed 9 years ago

ghost commented 9 years ago

Синтетический пример:

BEM.MODEL.decl('dm-feed', {

    feed_id: 'id',

    name: 'string',

});

BEM.MODEL.decl('dm-with-feeds-list', {

    feed: {
        type: 'models-list',
        modelName: 'dm-feed'
    }

});

BEM.MODEL.decl('dm-with-feed', {

    feed: {
        type: 'model',
        modelName: 'dm-feed'
    }

});

BEM.MODEL.create('dm-with-feeds-list').set('feed', [{ feed_id: 123, name: 'feed 123' }]);
BEM.MODEL.getOne({ name: 'dm-feed', id: 123 }); // ok: BEM.MODEL.getOne({ name: 'dm-feed', id: 123 }).id === 123;

BEM.MODEL.create('dm-with-feed').set('feed', { feed_id: 456, name: 'feed 456' });
BEM.MODEL.getOne({ name: 'dm-feed', id: 456 }); // fail: BEM.MODEL.getOne({ name: 'dm-feed', id: 456 }) is undefined

То, что добавилось в dm-with-feed имеет сгенерированный id, а не тот что должен иметь.

belyanskii commented 9 years ago

👍

dosyara commented 9 years ago

Между примером с models-list и model есть принципиальная разница. В случае models-list модели еще нет и она создается с правильным id. А для model – модель сосздается во время создания родительской и потом апдейтиться. При этом метод update не изменяет id модели, так как это кажется небезопасно. Возможно, в случае пустой модели, можно изименять id, нужно только проверить, что все внутренние хранилища правильно на это отреагируют.

ghost commented 9 years ago

Понятно, а нельзя получается для случая

BEM.MODEL.create('dm-with-feed').set('feed', { feed_id: 456, name: 'feed 456' });

создавать в поле feed новую модель, я просто ожидал именно поведения такого, не знал что там модель уже есть (видимо сорсы плохо смотрел)

То есть правильнее будет делать так

BEM.MODEL.create('dm-with-feed').set('feed', BEM.MODEL.create({ name: 'dm-feed', id: 456 }, { feed_id: 456, name: 'feed 456' }));

или учитывая Димины правки так

BEM.MODEL.create('dm-with-feed').set('feed', BEM.MODEL.create('dm-feed', { feed_id: 456, name: 'feed 456' }));

зная что поле feed_id имеет тип 'id'

dosyara commented 9 years ago

Кажется должна работать такая схема с пересозданием модели, код про сохранение подписчиков есть. Это немного опасное изменение, потому что мы не фильтруем данные при set'ах.