Есть замечательный фреймворк построения веб-приложений — Polymer. Это даже скорее не фреймворк, а реализация идеологии WebComponents в современных реалиях веб-браузеров.
Если кратко, то с его помощью можно реализовывать полноценный, удобный и быстрый (как с точки зрения производительности решения, так и скорости разработки) MVVM в JavaScript:
<dom-module id="my-component">
<template>
<h4>ToDo list for {{name}}:</h4>
<ul>
<template is="dom-repeat" items="{{model.todoitems}}">
<li>{{item.title}}</li>
</template>
</ul>
<button title="ChangeName" on-tap="ChangeName"></button>
</template>
</dom-module>
<script>
Polymer({
is: 'my-component',
name: 'Artur',
model: {
items: [
{title: '1'}
]
},
ChangeName: function() {
this.model.name = this.name + "_1";
},
});
</script>
В WPF мы привыкли, что интерфейс перерисовывается автоматически, при изменении значения свойства: this.name = ‘New Name’;. Однако у многих js-mvvm-фреймворков, присвоения приходится производить с помощью магических функций: this.set(‘name’, this.name + «_1»). В Polymer успешно работает первый (удобный :)) вариант, однако при работе с массивами и вложенными объектами эти прелести заканчиваются. Код добавления новых элементов в список ToDo выглядит примерно так:
Add: function() {
this.push('items', {title: 'another item'});
}
Редактирование же элементов в списке (например, изменение title) будет еще более ужасным:
this.set('items.1.title', 'new title!');
Continue reading