Что-то вроде MVC...
Работаю над плагином, хочу полностью отделить "представление" от "модели"
К плагину поступают необходимые данные DOM в виде объекта. Происходит инициализация. После взаимодействия пользователя с приложением - плагин меняет в имеющихся данных значения При некоторых сценариях работы плагина должны появляться popup-сообщения.. Например, сообщение "Ваши данные отправлены на сервер" или "В корзине 5 товаров" и т.д. Как лучше делать эти сообщения: 1. В плагине с помощью createElement - но тогда это будет уже влияние на структуру DOM! 2. Сделать в html несколько окон с display:none. При необходимости вносить изменения в них и отображать на клиенте - но это будет будет уже костыль, и программист, использующий плагин должен будет дописывать его к разметке 3. Сделать отдельных скрипт для создания этих сообщений? 4 .... Вот живой пример: http://demo.hnoe.ru/7.html При клике на цифру с товарами в корзине - должна отображаться информация о товарах, или при клике оформить заказ - окошко с данными. Как это грамотно реализовать? |
Даю подсказку триггеры и data binding!
|
не уверен что правильно понял что ты хочешь.
пример отделения данных
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<button id="add"> добавить товар </button>
<div id="cart"> </div>
<script>
store=function(){
this.data=[];
this.event={};
};
store.prototype={
fire:function(name,options){
for (item in this.event[name]) this.event[name][item](options);
},
on:function(name,fun){
if (typeof this.event[name]=="undefined") this.event[name]=[];
this.event[name].push(fun);
},
add:function(data){
this.data.push(data);
this.fire('change');
},
get:function(){
//бла бла
},
each:function(fun){
var data=this.data,
i=0,
len=this.data.length;
for(;i<len;i++){
fun(data[i],i,this)
}
}
}
//контролёр
function test(){
// заполняем данными
var m=new store(),
el=document.getElementById('add'),
cart=document.getElementById('cart');
el.addEventListener('click',function(){
m.add({price:100,name:"хреновина"});
});
m.on('change',function(){
var sum=0,text="";
m.each(function(e){
sum+=e.price;
text+=e.name+" за "+ e.price+"$<br/>";
})
if (sum>500) text=text+"вы золотой покупатель"
else if (sum>300) text=text+"вы серебрянный покупатель";
cart.innerHTML=text;
})
};
test();
</script>
</body>
</html>
|
| Часовой пояс GMT +3, время: 21:03. |