Здравствуйте
Я делаю свою реализацию библиотеки KnockoutJS и мне нужен ваш совет.
Сперва отвечу на вопрос "Зачем делать свою реализацию?".
- Мне не нравится то что биндинги нужно описывать в атрибутах тегов.
- Имея свою готовую модель, не так просто прилепить к ней нокаут. Нужно переписывать все сеттеры и добавлять в них сеттеры нокаута.
- Для работы с массивами приходиться хранить копию массива в своей модели и в нокауте.
- Сам нокаут недостаточен для того, чтобы использовать его как модель, так как нету методов синхронизации с сервером.
Как я предлагаю создавать конфиг биндингов
var conf = {
".name": {text: "name"},
".age": {
text: "age",
css: {
red: "age > 50",
orange: "30 < age && age <= 50",
green: "age <= 30"
}
},
".friends": {
foreach: {
field: "friends",
bind: {
".name": {text: "name"}
}
}
}
};
var viewModel = ko.applyBindings(model, conf, rootNode);
Объект viewModel в себе хранит один метод trigger который принимает имя поля или метода в модели и обновляет все ноды, которые имеют биндинги связанные с этим полем или методом.
На данный момент реализовано биндинги text и css. Я остановился на foreach. Мне интересна ваша мысль как лучше всего описывать конфиг этого биндинга и как говорить viewModel что изменилось какое-то поле объекта внутри массива?
Моё предложение вот так сделать конфиг
{
foreach: {
field: "friends",
parentName: "parent",
initViewModel: true,
bind: {
".name": {text: "name + ' is friend of ' + parent.name"}
}
}
}
а тригерить вот так
viewModel.get('friends')[0].trigger('name');
Если initViewModel будет равен false тогда зависимости между элементами массива и вьюшкой не создадутся.
Естественно parentName и initViewModel будут иметь какие-то дефолтные значения и их писать не нужно будет, вопрос только какие значения?
ещё одна идея для сокращения конфига - вместо bind писать имя массива в модели
{
foreach: {
friends: {
".name": {text: "name + ' is friend of ' + parent.name"}
}
}
}
Заранее спасибо за коментарии