1- # ============================ #
2- # Framework #
3- # ============================ #
4-
5-
6- class Events ():
7- def __init__ (self ):
8- self .events = dict ()
9-
10- def bind (self , event , callback ):
11- var (evs , ev , lst )
12- evs = list ()
13- evs .js_object = JS ('event.split(" ")' )
14- for ev in evs :
15- lst = self .events .get (ev , list ())
16- lst .append (callback )
17- self .events .set (ev , lst )
18-
19- def trigger (self , ev , args ):
20- var (lst , cb , args )
21- print ev
22- lst = self .events .get (ev )
23- if lst :
24- for cb in lst :
25- if args :
26- cb (args )
27- else :
28- cb ()
29-
30- e = Events ()
31- _counter = 0
32-
33-
34- class Model ():
35- def __init__ (self ):
36- self .id = "c-" + _counter
37- _counter = _counter + 1
38-
39- def to_string (self ):
40- return "<" + self .__class__ .__name__ + "(" + self .id + ")>"
41-
42- def toJSON (self ):
43- pass
44-
45- def change (self , callback ):
46- if callback :
47- e .bind ("change" , callback )
48- else :
49- e .trigger ("change" )
50-
51- def fetch (self , callback ):
52- if callback :
53- e .bind ("fetch" , callback )
54- else :
55- e .trigger ("fetch" )
56-
57- def destroy (self ):
58- e .trigger ("destroy" , self )
59-
60-
61- class Collection ():
62- def __init__ (self ):
63- self .ids = dict ()
64- self .models = list ()
65- e .bind ("destroy" , self .remove_one )
66-
67- def add_one (self , model ):
68- self .ids .set (model .id , model )
69- self .models .append (model )
70- e .trigger ("add" , model )
71-
72- def add (self , models ):
73- self .add_one (models )
74-
75- def remove (self , models ):
76- self .remove_one (models )
77-
78- def remove_one (self , model ):
79- if model .__class__ .__name__ == 'list' :
80- model = model .pop ()
81- new_ids = dict ()
82- new_models = list ()
83- ks = self .ids .keys ()
84- for k in ks :
85- if k != model .id :
86- m = self .ids .get (k )
87- new_ids .set (k , m )
88- self .ids = new_ids
89-
90- for m in self .models :
91- if m .id != model .id :
92- new_models .append (m )
93- self .models = new_models
94- e .trigger ("remove" , model )
95-
96-
97- class Controller ():
98- def __init__ (self , tag , el ):
99- if el == None :
100- el = '<div></div>'
101- self .el = J (el )
102-
103- def release (self ):
104- j = self .el .j
105- JS ('j.remove()' )
106-
107-
108- # ============================ #
109- # Application #
110- # ============================ #
111-
1121class TaskModel (Model ):
1132 def __init__ (self , name ):
1143 Model .__init__ (self )
@@ -121,13 +10,13 @@ def __init__(self, model):
12110 Controller .__init__ (self , "div" , None )
12211 self .model = model
12312 self .el .addClass ("item" )
124- #self.el.bind("click", false, self.say)
12513 self .el .delegate (".view" , "dblclick" , self .edit )
12614 self .el .delegate (".close" , "click" , self .close )
12715 self .el .delegate (".destroy" , "click" , self .remove )
12816
12917 def html (self ):
130- source = "<div class='view'>{{name}}<a href='#' class='button destroy taskbutton'>x</a></div>" + "<div class='row collapse edit'><div class='large-10 columns'><input type='text' value={{name}}></div>" + "<div class='large-2 columns'><a class='button prefix close'>ok</a></div></div>"
18+ source = "<div class='row collapse view'><div class='large-10 columns'><input type='checkbox'>{{name}}<a href='#' class='destroy'></a></div></div>" + "<div class='row collapse edit'><div class='large-10 columns'><input type='text' value={{name}}></div>" \
19+ + "<div class='large-2 columns'><a class='button prefix close'>ok</a></div></div>"
13120 template = JS ("Handlebars.compile(source)" )
13221 name = self .model .name
13322 data = JS ("template({name:name})" )
@@ -139,7 +28,9 @@ def edit(self):
13928
14029 def close (self ):
14130 self .el .removeClass ("editing" )
142- print "remove editing"
31+ j = self .el .find ("input[type=text]" ).j
32+ name = JS ("j.val()" )
33+ self .model .updateAttribute ("name" , name )
14334
14435 def remove (self ):
14536 print "clicked: " + self .model .to_string ()
@@ -165,6 +56,7 @@ def __init__(self, el, collection):
16556 button = J ("#newtask" )
16657 button .bind ("click" , false , self .create )
16758 e .bind ("add" , self .render )
59+ e .bind ("update" , self .render )
16860
16961 def create (self ):
17062 j = J ("#taskinput" ).j
0 commit comments