@@ -12,9 +12,10 @@ window.helden = (function(){
1212 /**
1313 * observable implementation of array
1414 */
15- function ObservableArray ( onAdd , onRemove ) {
15+ function ObservableArray ( onAdd , onRemove , onUpdate ) {
1616 this . onAdd = onAdd
1717 this . onRemove = onRemove
18+ this . onUpdate = onUpdate
1819 this . length = 0
1920 var counter = 0
2021 var array = [ ]
@@ -100,6 +101,7 @@ window.helden = (function(){
100101 var name = null
101102 var model = new ObservableArray ( )
102103 var onChange = DO_NOTHING
104+ var autoRemoveTemplate = true
103105 this . selector = selector
104106
105107 this . onChange = function ( callback ) {
@@ -109,12 +111,19 @@ window.helden = (function(){
109111 return this
110112 }
111113
114+ this . autoRemoveTemplate = function ( value ) {
115+ if ( value != null && value != undefined )
116+ autoRemoveTemplate = value
117+ return this
118+ }
119+
112120 this . configure = function ( view , originalModel , defaultValue , parentModel ) {
113121
114122 name = this . selector . replace ( / [ ^ a - z A - Z 0 - 9 ] / g, '' )
115123 var parent = view . parent ( )
116124 var template = view . clone ( )
117- view . remove ( )
125+ if ( autoRemoveTemplate )
126+ view . remove ( )
118127
119128 model . onAdd = function ( index , item ) {
120129 var clone = template . clone ( )
@@ -234,7 +243,7 @@ window.helden = (function(){
234243 var objview = obj . selector ? view . find ( obj . selector ) : view
235244 var resp = obj . configure ( objview , target , defaultValue , parentModel )
236245 resp . $ = objview
237- target [ attr ] = resp
246+ target [ attr ] = wrap ( resp , obj )
238247 }
239248 }
240249 return target
@@ -244,6 +253,66 @@ window.helden = (function(){
244253 return ( typeof obj ) == 'function'
245254 }
246255
256+ function wasDefined ( value ) {
257+ return ( value != undefined && value != null )
258+ }
259+
260+ function wrap ( method , target ) {
261+ var wrapped = method . bind ( target )
262+ wrapped . is_wrapped = true
263+ return wrapped
264+ }
265+
266+ function unwrap ( object ) {
267+
268+ function unwrap_array ( object ) {
269+ var arr = [ ]
270+ for ( var i = 0 ; i < object . length ; i ++ )
271+ var value = unwrap ( object [ i ] )
272+ if ( value != undefined )
273+ arr . push ( value )
274+ return arr
275+ }
276+
277+ function unwrap_oarray ( object ) {
278+ var arr = [ ]
279+ for ( var i = 0 ; i < object . length ; i ++ ) {
280+ var value = unwrap ( object . get ( i ) )
281+ if ( value != undefined )
282+ arr . push ( value )
283+ }
284+ return arr
285+ }
286+
287+ function unwrap_object ( object ) {
288+ var obj = { }
289+ for ( var attr in object ) {
290+ if ( ! H . unserializableAttributes [ attr ] ) {
291+ var value = unwrap ( object [ attr ] )
292+ if ( value != undefined )
293+ obj [ attr ] = value
294+ }
295+ }
296+ return obj
297+ }
298+
299+ function unwrap_method ( method ) {
300+ if ( method . is_wrapped )
301+ return method ( )
302+ }
303+
304+ if ( object instanceof helden . ObservableArray )
305+ return unwrap_oarray ( object )
306+ else if ( object instanceof Array )
307+ return unwrap_array ( object )
308+ else if ( ( typeof object ) == 'function' )
309+ return unwrap_method ( object )
310+ else if ( ( typeof object ) == 'object' )
311+ return unwrap_object ( object )
312+ else
313+ return object
314+ }
315+
247316 /**
248317 * A reflective constructor instantiator
249318 */
@@ -313,12 +382,25 @@ window.helden = (function(){
313382 */
314383 Selector . extensions = {
315384
385+ accessor : function ( initialValue ) {
386+
387+ this . configure = function ( view , model , newValue ) {
388+ var value = newValue
389+ return function ( newValue ) {
390+ if ( wasDefined ( newValue ) )
391+ value = newValue
392+ return value
393+ }
394+ }
395+
396+ } ,
397+
316398 bindAttr : function ( attr ) {
317399 this . configure = function ( view , model , value ) {
318400 var method = function ( newValue ) {
319401 if ( wasDefined ( newValue ) )
320- model . attr ( attr , newValue )
321- return model . attr ( attr )
402+ view . attr ( attr , newValue )
403+ return view . attr ( attr )
322404 }
323405
324406 if ( wasDefined ( value ) )
@@ -356,12 +438,18 @@ window.helden = (function(){
356438 ObservableArray : ObservableArray ,
357439
358440 dsl : {
441+ unserializableAttributes :{
442+ toJS : true ,
443+ ID_ForEachBinder : true
444+ } ,
359445 observable : makeModelObservable ,
360446 observeAView : makeModelObserveAView ,
361447 bindAttr : Selector . extensions . bindAttr ,
362448 bindProp : Selector . extensions . bindProp ,
363449 bindCss : Selector . extensions . bindCss ,
364450 bind : Selector . prototype . bind ,
451+ wasDefined : wasDefined ,
452+ toJS : unwrap ,
365453 select : function ( )
366454 {
367455 if ( arguments . length == 1 && ( typeof arguments [ 0 ] ) == "string" )
@@ -370,11 +458,13 @@ window.helden = (function(){
370458 }
371459 }
372460 }
461+
462+ Selector . apply ( helden . dsl )
373463 return helden
374464} ) ( )
375465
376466window . H = helden . dsl
377- if ( ( typeof noGlobals ) == "undefined" )
467+ if ( ( typeof useGlobals ) != "undefined" )
378468 for ( var attr in H )
379469 if ( ! window [ attr ] )
380470 window [ attr ] = H [ attr ]
@@ -384,10 +474,6 @@ if ( (typeof noGlobals)=="undefined" )
384474 */
385475! function ( ) {
386476
387- function wasDefined ( value ) {
388- return ( value != undefined && value != null )
389- }
390-
391477 /**
392478 * Defines if a view should be visible or not
393479 */
@@ -397,7 +483,7 @@ if ( (typeof noGlobals)=="undefined" )
397483 this . configure = function ( view , model , value )
398484 {
399485 var method = function ( v ) {
400- if ( wasDefined ( v ) )
486+ if ( H . wasDefined ( v ) )
401487 setValue ( v )
402488 return isVisible
403489 }
@@ -409,7 +495,7 @@ if ( (typeof noGlobals)=="undefined" )
409495 isVisible = v
410496 }
411497
412- value = wasDefined ( value ) ? value : isVisible
498+ value = H . wasDefined ( value ) ? value : isVisible
413499 method ( value )
414500 return method
415501 }
0 commit comments