bem / bem-mvc Goto Github PK
View Code? Open in Web Editor NEWYet another MVC for i-bem
Yet another MVC for i-bem
Столкнулся с необычным поведением, но потом почитал код и понял что оно предусмотрено :)
Вообщем хочу поговорить про реализацию данной функции: https://github.com/bem/bem-mvc/blob/master/common.blocks/i-model/i-model.js#L502-L515
Мой кейс такой. Я использую коллекцию моделек (models-list) и когда вызываю метод set
, в который передаю новый список моделек, то получается, что если новые модельки совпадают по значению, а также совпадает их количество, то данные в коллекции не обновляются.
А смущает тем, что у меня разные биндинги навешаны на разные дочерние модельки и когда я ожидаю, что коллекция обновиться (а она не обновляется) у меня возникает небольшой колапс: интерфейс перестает реагировать.
Собственно вопрос такой, можем ли мы доработать models-list, чтобы он сравнивал модели по id или мне лучше пересмотреть мою реализацию интерфейса?
Привет, хочу понять, почему isEmpty
делает еще проверку на дефолтное значение модели?
https://github.com/bem/bem-mvc/blob/master/common.blocks/i-model/__field/i-model__field.js#L227-L229
На деле, я хочу сбросить значение модели, но не получается, так как текущее значение соответствует дефолтному и isEqual возвращает всегда true.
На данный момент есть только bemhtml шаблоны. (v2)
Из-за использования ключа default при декларации моделей в IE (проверено в 7-ой версии) возникает ошибка. Приходится брать его в кавычки.
Также из-за использования зарезервированных слов ломается минимизация в ycssjs.
api select
поменялось.
В этом файле https://github.com/bem/bem-mvc/blob/v2/desktop.bundles/todos/blocks/todos/todos.js
Надо
modules.define('i-bem__dom', ['jquery', 'BEMHTML'], function(provide, $, BEMHTML, BEMDOM) {
В блоке i-glue можно задать исходные значения полей модели, например:
mix: [{
block: "i-glue",
js: {
modelName: "model-rest__creative",
modelData: {
id: creativeId,
campaignId: campaignId,
templateId: templateId
}
}
}]
Хотелось бы, чтобы эти значения автоматически подставлялись в контролы, приклеенные к полям. И наоборот, если значения не заданы, чтобы в модель копировались текущие значения контролов.
Подводные камни при инициализации контролов из модели:
Корректно обрабатывать ситуацию, когда на одном элементе проклеено два i-glue__model-field (с разными модификаторами)
Синтетический пример:
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, а не тот что должен иметь.
в glue.js просим ['i-bem__dom', 'objects', 'jquery', 'model']
а в glue.deps.js есть только glue-field
Если валидировать модель с полями типа model, то error на вложенных моделях не всплывет, только на родительской модели.
Если получить значение поля модели(type array) и изменить произвольный элемент, то изменения отразятся на поле модели без метода set:
var array = model.get('arrayField');
array[0] = 'some new value';
array[0] === model.get('arrayField')[0]; // --> true
It will be good, if we can implement server synchronisation. Like Fetching, Persisting Data in the web server.
Пытаюсь наладить сборку на актуальных версиях bem-components
.
Вопрос о тестах возник после правки 58ac432#diff-fe894527c21cbc977d795eac412ce183
Странное поведение когда я внутри модели инициализирую список моделей то приходят ивенты change. Это очень странно и мешает
Обнаружил странное поведение метода BEM.MODEL.create().
Если создать модель на клиенте, то в данные попадает клиентский id модели вида "uniq42".
Судя по коду это сделано осознанно, но не понятно зачем, поскольку на первый взгляд это кажется концептуально неверным.
Если смотреть на модели как на часть REST-архитектуры, это кажется странным, поскольку id данных – это компетенция бэкенда. Если на клиенте создана новая модель, то она не имеет id и, соответственно, считается новой, отправляется на сервер методом POST (что мэпится на create), после чего возвращается уже модель с настоящим id.
Пример, создавая модель нижеследующим образом, в данные попадает клиентский id
BEM.MODEL.create("model-name", {
someField: "someValue"
});
MODEL.FIELD.types['inner-events-storage'] = $.inherit(MODEL.FIELD, {
/**
* Хранилище обработчиков событий на вложенных моделях
*/
_eventHandlers: {},
...
Есть ощущение, что созданный таким образом хэш обработчиков событий будет единым для всех экземпляров класса.
i-model__utils.js использует i-jquery__debouce. Если i-jquery__debouce не указать принудительно в deps'ах блока, применяющего модели, то модель будет инициализироваться с еще не проинициализированным i-jquery__debouce
Нужна возможность указывать полю модели, что оно внутреннее и не показывается при сериализации в методе toJSON
Правильно я понимаю, что в одной модели не может быть двух полей с одинаковым классом модели?
BEM.MODEL.decl('model', {
field0: {
type: 'models-list',
name: 'submobel'
},
field1: {
type: 'models-list',
name: 'submobel'
}
Судя по тому, как формируется eventPath
в BEM.MODEL.on(...)
(
bem-mvc/common.blocks/i-model/i-model.js
Line 748 in a25c19a
Хочется, чтобы какой-то такой вызов
BEM.MODEL.get({ name: 'model', id: [1, 2, 3] })
возвращал массив из 3 инстансов модели.
Сейчас если вызвать метод "un" у модели без аргументов, то он вызовет базовый метод "un" $.observable, но не отпишется от событий собственных полей. И что-бы отписаться от полей, надо их непосредственно перечислить, что не очень удобно и можно упустить вновь добавленное.
Предлагаю добавить в API коллекций метод where (по аналогии с бэкбоном).
Если поддержите, готов реализовать сам.
У модели имеется возможность задавать поля с типом model, которые представленны вложенной моделью.
Сейчас если родительская модель удаляется или полю с этим типом задается новая модель, то предыдущая модель удаляется. Необходимо по умолчанию сохранять модель, но добавить флаг, который будет удалять вложенную модель.
Следующий bemjson теоретически должен бы добавлять два биндера: один input, и один mod.
{
block: 'input',
mix: [
{
block: 'i-glue',
elem: 'model-field',
mods: {type: 'input'},
js: {name: 'foo'}
},
{
block: 'i-glue',
elem: 'model-field',
mods: {type: 'mod'},
js: {name: 'bar', mod: 'disabled', block: 'input'}
}
]
}
На самом деле он и добавляет оба, но второй (type: 'mod'
) не получает правильных параметров, т.к. в onclick
соответствующего DOM-элемента попадет такая конструкция:
return {
"i-glue__model-field":{
"name":"foo"
}
}
делать нужно будет после #138
Часто бывает необходимо изменить состояние модели без вызова соответствующих событий (add/change/update).
Подобная опция реализована в backbone (пример: http://backbonejs.ru/#Model-set)
Глобальная подписка на события BEM.MOEDL.on
работает неээфективно. Обработчики сейчас кешируются и перенавешиваются на инстансы.
Нужно реализовать такие события через триггер на классе.
Пропущена запятая в декларации переменных.
we can implement different storage support for the model data. like localstorage or indexeddb. because there are lot of situations where developer use model to have sync with local storage and indexed db.
мы можем реализовать различные хранения поддержку модели данных. как localstorage или индексированная база данных. потому что есть много ситуаций, когда разработчик использовать модели для синхронизации с локальным хранилищем и индексируются дБ
В продожение ишью #35 и коммита 683a1a8
Теперь поле типа model можно задать через set, но при этом событие change на вложенной модели на тригерит change на поле. Приходится делать такой хак
this._creative.set("parameters", model);
// хак для тригерения события на поле родительской модели
model.on("change", function() {
this._trigger("change", { fields: model.changed });
}, this._creative.fields.parameters);
Нужна возможность описать функцию валидации всей модели.
Данная возможность позволит создавать "статические" методы на классах.
Это изменение ломающее обратную совместимость.
Конструкторы моделей становятся доступны следующим образом: BEM.MODEL.models['modelName']
.
Созданные инстансы моделей переехали в BEM.MODEL._modelsStorage
Привет!
Я тут столкнулся с необходимость вручную генерировать ошибки на полях модели и чтобы не создавать велосипеды хочу использовать метод _trigger() на полях модели публичным.
Что вы об этом думаете? Я готов прислать pr.
Инициализирую модель.
После этого подписываюсь на ивент change
Они начинают приходить 0_о
Оказывается при инициализации ивенты уходят в слип на 500мс и затем пробрасываются.
Так вот зачем они вообще ходят если нет не одного внешнего подписчика?
Пример:
BEM.MODEL.decl("m-creative", {
id: "string",
name: "string",
params: {
type: "model",
name: "m-params"
}
});
BEM.MODEL.decl("m-params", {
id: "string",
name: "string",
list: {
type: "model-list",
name: "m-param"
}
});
var creativeModel = BEM.MODEL.create("m-creative", {
name: "blah"
});
var paramsModel = BEM.MODEL.create("m-params", {
name: "blah"
});
creativeModel.set("params", paramsModel);
Предполагаю, что тут https://github.com/bem/bem-mvc/blob/master/common.blocks/i-glue-field/i-glue-field.deps.js правильнее было бы декларировать нужные типы i-glue-field
руками на проекте, чтобы не навязывать лишний код тем, кто использует только часть из них?
BEM.MODEL.decl('item-model', { value: 'boolean' });
BEM.MODEL.decl('list-model', {list: { type: 'models-list', modelName: 'item-model'}});
var model = BEM.MODEL.create('list-model', {list: [{value: true}]});
model.isChanged()
model.isChanged() returns false
model.isChanged() returns true
Хотелось бы что-то вроде silent или лучше транзакции.
Ситуация следующая у меня есть кнопка которая бегает по модели и делает кучу изменений. Есть блок где то наверху который слушает изменения модели и отправляет аякс запросы. И таким образом без заглушек с таймаутами я получаю кучу запросов.
В идеале это решается транзакциями, но можно и silent режимом
При использовании пакета с bem-core (v2.8) и bem-mvc (v2). Появляется следующая проблема:
var insertedDom = BEMDOM.append(node, htmlStr); //undefined
Методы изменяющие dom перестаю возвращать изменения. А это очень полезная фича.
Нужно ли переопределение блока i-bem__dom
на уровне bem-mvc
?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.