GithubHelp home page GithubHelp logo

bem-mvc's People

Contributors

alexeyraspopov avatar belyanskii avatar coffeeich avatar collapsus avatar cyn avatar dosyara avatar ftdebugger avatar heliarian avatar hsalkaline avatar kabzon13 avatar kislovm avatar skywhale-ya avatar sullenor avatar tadatuta avatar ya-blitz avatar yuryshulaev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bem-mvc's Issues

isEqual()

Столкнулся с необычным поведением, но потом почитал код и понял что оно предусмотрено :)
Вообщем хочу поговорить про реализацию данной функции: https://github.com/bem/bem-mvc/blob/master/common.blocks/i-model/i-model.js#L502-L515

Мой кейс такой. Я использую коллекцию моделек (models-list) и когда вызываю метод set, в который передаю новый список моделек, то получается, что если новые модельки совпадают по значению, а также совпадает их количество, то данные в коллекции не обновляются.

А смущает тем, что у меня разные биндинги навешаны на разные дочерние модельки и когда я ожидаю, что коллекция обновиться (а она не обновляется) у меня возникает небольшой колапс: интерфейс перестает реагировать.

Собственно вопрос такой, можем ли мы доработать models-list, чтобы он сравнивал модели по id или мне лучше пересмотреть мою реализацию интерфейса?

isEmpty()

Привет, хочу понять, почему isEmpty делает еще проверку на дефолтное значение модели?
https://github.com/bem/bem-mvc/blob/master/common.blocks/i-model/__field/i-model__field.js#L227-L229

На деле, я хочу сбросить значение модели, но не получается, так как текущее значение соответствует дефолтному и isEqual возвращает всегда true.

Инициализация контролов

В блоке i-glue можно задать исходные значения полей модели, например:

mix: [{
    block: "i-glue",
    js: {
        modelName: "model-rest__creative",
        modelData: {
            id: creativeId,
            campaignId: campaignId,
            templateId: templateId
        }
    }
}]

Хотелось бы, чтобы эти значения автоматически подставлялись в контролы, приклеенные к полям. И наоборот, если значения не заданы, чтобы в модель копировались текущие значения контролов.

Подводные камни при инициализации контролов из модели:

  • могут дергаться обраотчики на контролах (этот случай надо отличать от действий пользователя);
  • контролы c live-инициализацией - как быть с ними?

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

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

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, а не тот что должен иметь.

mutable value of field type array

Если получить значение поля модели(type array) и изменить произвольный элемент, то изменения отразятся на поле модели без метода set:

var array = model.get('arrayField');

array[0] = 'some new value';
array[0] === model.get('arrayField')[0]; // --> true

Server Syncronisation

It will be good, if we can implement server synchronisation. Like Fetching, Persisting Data in the web server.

Генерация id данных модели на клиенте при помощи $.identify()

Обнаружил странное поведение метода BEM.MODEL.create().
Если создать модель на клиенте, то в данные попадает клиентский id модели вида "uniq42".
Судя по коду это сделано осознанно, но не понятно зачем, поскольку на первый взгляд это кажется концептуально неверным.

Если смотреть на модели как на часть REST-архитектуры, это кажется странным, поскольку id данных – это компетенция бэкенда. Если на клиенте создана новая модель, то она не имеет id и, соответственно, считается новой, отправляется на сервер методом POST (что мэпится на create), после чего возвращается уже модель с настоящим id.

Пример, создавая модель нижеследующим образом, в данные попадает клиентский id

BEM.MODEL.create("model-name", {
    someField: "someValue"
});

Inner events storage handlers bug

Отсюда: https://github.com/bem/bem-mvc/blob/master/common.blocks/i-model/__field/_type/i-model__field_type_inner-events-storage.js#L10

MODEL.FIELD.types['inner-events-storage'] = $.inherit(MODEL.FIELD, {

        /**
         * Хранилище обработчиков событий на вложенных моделях
         */
        _eventHandlers: {},

   ...

Есть ощущение, что созданный таким образом хэш обработчиков событий будет единым для всех экземпляров класса.

Для i-model__utils.js не хватает зависимостей

i-model__utils.js использует i-jquery__debouce. Если i-jquery__debouce не указать принудительно в deps'ах блока, применяющего модели, то модель будет инициализироваться с еще не проинициализированным i-jquery__debouce

Два поля models-list с одним классом моделей

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

BEM.MODEL.decl('model', {
  field0: {
    type: 'models-list',
    name: 'submobel'
  },
  field1: {
    type: 'models-list',
    name: 'submobel'
}

Судя по тому, как формируется eventPath в BEM.MODEL.on(...)(

eventPath = MODEL.buildPath(modelParams),
), этого не может быть by design?

Возможность отписаться от всех событий модели

Сейчас если вызвать метод "un" у модели без аргументов, то он вызовет базовый метод "un" $.observable, но не отпишется от событий собственных полей. И что-бы отписаться от полей, надо их непосредственно перечислить, что не очень удобно и можно упустить вновь добавленное.

Добавить флаг для удаления вложенной модели на полях с типом model

У модели имеется возможность задавать поля с типом model, которые представленны вложенной моделью.
Сейчас если родительская модель удаляется или полю с этим типом задается новая модель, то предыдущая модель удаляется. Необходимо по умолчанию сохранять модель, но добавить флаг, который будет удалять вложенную модель.

models-list.

Привет, а почему при удалении модели из коллекции или очистки коллекции, эти модельки дестрактятся? Методы remove и clear соответственно.

Нельзя добавить несколько биндеров на один блок

Следующий 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"
  }
}

Отрефакторить глобальную подписку на события

Глобальная подписка на события BEM.MOEDL.on работает неээфективно. Обработчики сейчас кешируются и перенавешиваются на инстансы.
Нужно реализовать такие события через триггер на классе.

Storage Methods

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 или индексированная база данных. потому что есть много ситуаций, когда разработчик использовать модели для синхронизации с локальным хранилищем и индексируются дБ

Cобытиt change на вложенной модели

В продожение ишью #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

Ивенты накапливаются даже если нет не одного подписчика

Инициализирую модель.
После этого подписываюсь на ивент change
Они начинают приходить 0_о

Оказывается при инициализации ивенты уходят в слип на 500мс и затем пробрасываются.
Так вот зачем они вообще ходят если нет не одного внешнего подписчика?

Реализовать возможность непосредственного добавления модели в i-model__field_type_model

Пример:

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);

isChanged for models-list field always returns true

How to reproduce

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()

Expected result

model.isChanged() returns false

Actual result

model.isChanged() returns true

Нет транзакций

Хотелось бы что-то вроде silent или лучше транзакции.

Ситуация следующая у меня есть кнопка которая бегает по модели и делает кучу изменений. Есть блок где то наверху который слушает изменения модели и отправляет аякс запросы. И таким образом без заглушек с таймаутами я получаю кучу запросов.

В идеале это решается транзакциями, но можно и silent режимом

i-bem__dom.js меняет стандартное поведение

При использовании пакета с bem-core (v2.8) и bem-mvc (v2). Появляется следующая проблема:

var insertedDom = BEMDOM.append(node, htmlStr); //undefined

Методы изменяющие dom перестаю возвращать изменения. А это очень полезная фича.
Нужно ли переопределение блока i-bem__dom на уровне bem-mvc?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.