{"action":"created","issue":{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/620","labels_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/620/labels{/name}","comments_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/620/comments","events_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/620/events","html_url":"https://github.com/bem/bem-forum-content-ru/issues/620","id":109468302,"number":620,"title":"Удаление модификатора у элемента всех инстансов блока","user":{"login":"aChudinov","id":6690086,"avatar_url":"https://avatars.githubusercontent.com/u/6690086?v=3","gravatar_id":"","url":"https://api.github.com/users/aChudinov","html_url":"https://github.com/aChudinov","followers_url":"https://api.github.com/users/aChudinov/followers","following_url":"https://api.github.com/users/aChudinov/following{/other_user}","gists_url":"https://api.github.com/users/aChudinov/gists{/gist_id}","starred_url":"https://api.github.com/users/aChudinov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aChudinov/subscriptions","organizations_url":"https://api.github.com/users/aChudinov/orgs","repos_url":"https://api.github.com/users/aChudinov/repos","events_url":"https://api.github.com/users/aChudinov/events{/privacy}","received_events_url":"https://api.github.com/users/aChudinov/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/bemhtml","name":"bemhtml","color":"bfe5bf"},{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/bemjson","name":"bemjson","color":"bfe5bf"},{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/labels/i-bem","name":"i-bem","color":"bfe5bf"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":1,"created_at":"2015-10-02T10:28:05Z","updated_at":"2015-10-02T15:22:43Z","closed_at":null,"body":"В приложении типа чат есть два списка: список общих комнат и список приватных бесед.\r\nРеализовал их блоком `list` с соответствующим модификатором `type`.\r\n\r\nЗадача: реализовать выбор одного элемента из списка.\r\nПроблема: каждый инстанс блока `list` запоминает свой активный элемент списка.\r\n```\r\n// При клике на элемент списка ставлю соответствующий модификатор\r\n_onItemClick : function (e) {\r\n    var item = $(e.currentTarget);\r\n    var type = this.getMod(item, 'type');\r\n\r\n    this.setMod(item, 'current', true);\r\n}\r\n\r\n// При выставлении модификатора новому элементу, удаляю модификатор у предыдущего\r\nonElemSetMod : {\r\n    'item' : {\r\n        'current' : {\r\n            'true' : function (elem) {\r\n                this.delMod(this._current, 'current');\r\n                this._current = elem;\r\n            }\r\n        }\r\n    }\r\n}\r\n```\r\n\r\nКак грамотнее всего реализовать, чтобы при выборе одного элемента удалялся модификатор не только в текущем инстансе блока, а во всех списках?\r\n\r\nТак же интересует насколько правильной является реализация \"оборачивания\" всех элементов списка в контейнер с помощью создания нового элемента `container`\r\n```\r\n// BEMJSON\r\n{\r\n    block: 'list',\r\n    mods: { 'type' : 'channels' },\r\n    content: [\r\n        { elem: 'title', content: 'Каналы' },\r\n        { elem: 'container' }\r\n    ]\r\n}\r\n\r\n// BEMHTML\r\nblock('list').elem('container').tag()('ul');\r\n\r\n// JS-реализация загрузки данных в список\r\n_getListData : function (type) {\r\n    var container = this.elem('container');\r\n\r\n    API.get('channels.list', { type: type }).then(function (data) {\r\n        var channels = data.channels;\r\n\r\n        channels.forEach(function (channel) {\r\n            BEMDOM.append(container,\r\n                BEMHTML.apply({\r\n                    block : 'list',\r\n                    elem : 'item',\r\n                    mods : { type : type },\r\n                    content : channel.name,\r\n                    js : {\r\n                        id : channel.id,\r\n                        name : channel.name\r\n                    }\r\n                })\r\n            );\r\n        });\r\n    });\r\n}\r\n```\r\n\r\nСпасибо!"},"comment":{"url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/comments/145060156","html_url":"https://github.com/bem/bem-forum-content-ru/issues/620#issuecomment-145060156","issue_url":"https://api.github.com/repos/bem/bem-forum-content-ru/issues/620","id":145060156,"user":{"login":"tadatuta","id":475746,"avatar_url":"https://avatars.githubusercontent.com/u/475746?v=3","gravatar_id":"","url":"https://api.github.com/users/tadatuta","html_url":"https://github.com/tadatuta","followers_url":"https://api.github.com/users/tadatuta/followers","following_url":"https://api.github.com/users/tadatuta/following{/other_user}","gists_url":"https://api.github.com/users/tadatuta/gists{/gist_id}","starred_url":"https://api.github.com/users/tadatuta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tadatuta/subscriptions","organizations_url":"https://api.github.com/users/tadatuta/orgs","repos_url":"https://api.github.com/users/tadatuta/repos","events_url":"https://api.github.com/users/tadatuta/events{/privacy}","received_events_url":"https://api.github.com/users/tadatuta/received_events","type":"User","site_admin":false},"created_at":"2015-10-02T15:22:43Z","updated_at":"2015-10-02T15:22:43Z","body":"Например, можно в момент инициализации каждого `list` сохранять ссылку на него в класс:\r\n```js\r\nmodules.define('list', ['i-bem__dom'], function(provide, BEMDOM) {\r\n\r\nprovide(BEMDOM.decl(this.name, {\r\n    onSetMod : {\r\n        js : {\r\n            inited : function() {\r\n                // сохраняем данный list\r\n                var instances = this.__self.instances || (this.__self.instances = []);\r\n                instances.push(this);\r\n            }\r\n        }\r\n    },\r\n    onElemSetMod : {\r\n        item : {\r\n            current : {\r\n                'true' : function (elem) {\r\n                    // обходим все list-ы и удалям current\r\n                    this.__self.instances.forEach(function(list) {\r\n                        list.delMod(list.elem('item'), 'current');\r\n                    });\r\n\r\n                    this._current = elem;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}));\r\n\r\n});\r\n```\r\n\r\n> насколько правильной является реализация \"оборачивания\" всех элементов списка в контейнер с помощью создания нового элемента container\r\n\r\nВполне нормальный способ."}}