Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Подписка на изменение значения атрибута компонента #42

Open
aliksend opened this issue Apr 16, 2015 · 5 comments

Comments

@aliksend
Copy link

Привет всем. Сразу к делу!
Суть в том, что хочется создать что-то типа значение selected у option (вложенного в select), но у span с input(type='text').
То есть создать компонент типа "изменяемый текст" - надпись, которая, если нажать, заменяется на поле ввода, пользователь редактирует значение, нажимает Enter и значение обновляется (у других пользователей в том числе).
Есть уже готовая реализация данного компонента, но был обнаружен баг в самом фреймворке (или у меня руки из Ж, подскажите).

В общем тестовый проект

В пустом проекте в index.jade

each _page.items
  button.btn.btn-default(on-click='deleteItem(this.id)') {{this.title}}
  test-comp(value='{{this.title}}')

и в index.js

app.component(require('../../components/test-comp'));
app.proto.deleteItem = function(id) {
    this.model.del('items.' + id);
}
app.get('/', function(page, model) {
    model.subscribe('items', function() {
        if (!model.get('items')) {
            model.add('items', { title: 'item 1'});
            model.add('items', { title: 'item 2'});
            model.add('items', { title: 'item 3'});
            model.add('items', { title: 'item 4'});
            model.add('items', { title: 'item 5'});
        }
        model.filter('items', true).ref('_page.items');
        page.render('home');
    });
});

(стандартная часть пропущена)

Создаём в папке component папку test-comp
В самом компоненте index.jade

index(element='test-comp'):
  p {{@value}}
  p
    b {{value}}

index.js компонента

module.exports = TestComp;
function TestComp() {}
TestComp.prototype.view = __dirname;
TestComp.prototype.init = function(model) {
    model.subscribe('value', function() {
        console.log('value: ' + model.get('value'));
        model.on('change', 'value', function(n, o) {
            console.log('value changed from ' + o + ' to ' + n);
        })
    });
}

Всё хорошо работает и правильно отображается до тех пор, пока не начать кликать на кнопки. Значение простого текста меняется правильно, а значение полужирного ведёт себя странно. Как раз в index.js компонента строка model.subscribe('value', ...) подписывается как раз на выделенное жирным значение, что видно в консоли.

Вывод консоли при удалении третьего элемента:

value changed from item 3 to undefined
value changed from item 4 to item 5
value changed from item 5 to undefined

Скрин:
trouble

Подписка на @value не работает. Как можно корректно обрабатывать изменение значения аттрибута?
Рассчитываю на вашу помощь
Спасибо

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

@minicuper
Copy link
Contributor

Посмотрите на этот пример, если я правильно понял - это примерно то, что имелось ввиду - http://codepen.io/zag2art/pen/Wvevdb?editors=101 (пример, правда, на derby-standalon [только клиентская часть - на подобии ангуляра], но должно быть понятно)

Не понимаю зачем вы делаете subscribe в init-е компонента.

@aliksend
Copy link
Author

Спасибо за ответ, интересная штука derby-standalone

Дело в том, что, если значение редактируется одним пользователем, а в это время это значение изменил кто-то другой, первому показывается сообщение типа "значение было изменено. новое значение: ...", ну и соответственно при отмене редактирования (кнопка esc, подсказка отображается при включенном редактировании) будет отображаться измененное вторым пользователем значение, а при нажатии enter (подтверждение ввода) у всех пользователей значение изменится на то, которое вводил второй пользователь. Возможно ли такое сделать в вашем примере?
Надеюсь объяснил понятно

Спасибо

@minicuper
Copy link
Contributor

Возможно ли такое сделать в вашем примере?

Конечно можно, подписка на события в модели все это охватывают, правда для придется использовать чистый derby для одновременности.

На выходных, если найду время, покажу.

@minicuper
Copy link
Contributor

Подредактировал http://codepen.io/zag2art/pen/Wvevdb?editors=101 для демонстрации идеи вывел один и тот же список два раза. Вы можете одновременно редактировать один и тот же элемент в двух списках. Посмотрите то ли это. Правильно ли я вас понял.

@aliksend
Copy link
Author

У меня тоже в таком (похожем) виде все работает. Пока не начать нажимать на кнопки. Попробуйте удалить непоследний элемент http://codepen.io/anon/pen/yNBoGd?editors=101

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants