@@ -10,6 +10,8 @@ import {
1010
1111import Template from './Template' ;
1212
13+ import ViewList from './ViewList' ;
14+
1315import { debounce , nextTick } from '../DOM/timer' ;
1416
1517import CustomInputEvent , { watchInput } from '../DOM/CustomInputEvent' ;
@@ -22,7 +24,6 @@ const view_template = Symbol('View template'),
2224 view_top = new Map ( ) ,
2325 view_injection = Symbol ( 'View injection' ) ,
2426 view_varible = [ 'view' , 'scope' ] ,
25- element_view = new WeakMap ( ) ,
2627 top_input = new WeakMap ( ) ;
2728
2829export default class View extends Model {
@@ -79,7 +80,7 @@ export default class View extends Model {
7980 * @return {String } HTML/XML source code of this View
8081 */
8182 toString ( ) {
82- return stringifyDOM ( this . topNodes ) ;
83+ return stringifyDOM ( this . topNodes ) . replace ( / \s + $ / gm , '' ) ;
8384 }
8485
8586 /**
@@ -125,12 +126,14 @@ export default class View extends Model {
125126 return ;
126127 }
127128
128- const sub_view = [ ] ;
129-
130- element_view . set ( element , sub_view ) ;
129+ const view_list = new ViewList (
130+ element ,
131+ this . data ,
132+ this [ view_injection ]
133+ ) ;
131134
132135 this . watch ( name , {
133- get : ( ) => ( sub_view [ 1 ] ? sub_view : sub_view [ 0 ] )
136+ get : ( ) => ( view_list [ 1 ] ? view_list : view_list [ 0 ] )
134137 } ) ;
135138 }
136139
@@ -272,11 +275,18 @@ export default class View extends Model {
272275 template . evaluate . apply ( template , [ element ] . concat ( injection ) ) ;
273276 } ) ;
274277
275- for ( let { type, element, template , name } of this )
278+ for ( let { type, element, name } of this )
276279 if ( type === 'View' ) {
277280 await nextTick ( ) ;
278281
279- await this . renderSub ( temp [ name ] , name , element , template ) ;
282+ const view_list = new ViewList ( element ) ,
283+ data = temp [ name ] ;
284+
285+ if ( data === null ) view_list . clear ( ) ;
286+ else if ( data )
287+ await view_list . render (
288+ data instanceof Array ? data : [ data ]
289+ ) ;
280290 }
281291
282292 if ( root )
@@ -293,40 +303,4 @@ export default class View extends Model {
293303
294304 view_top . delete ( this ) ;
295305 }
296-
297- /**
298- * @protected
299- *
300- * @param {Object } data
301- * @param {String } name
302- * @param {Element } element
303- * @param {String } template
304- */
305- async renderSub ( data , name , element , template ) {
306- if ( ! data && data !== null ) return ;
307-
308- const sub = element_view . get ( element ) ,
309- isArray = data instanceof Array ,
310- _data_ = this . data ;
311-
312- data = isArray ? Array . from ( data ) : data ? [ data ] : [ ] ;
313-
314- sub . splice ( data . length , Infinity ) . forEach ( view => view . destroy ( ) ) ;
315-
316- for ( let i = 0 ; data [ i ] ; i ++ ) {
317- sub [ i ] =
318- sub [ i ] || new View ( template , this . data , this [ view_injection ] ) ;
319-
320- if ( isArray ) _data_ [ name ] [ i ] = sub [ i ] . data ;
321- else _data_ [ name ] = sub [ i ] . data ;
322-
323- await sub [ i ] . render ( data [ i ] ) ;
324- }
325-
326- if ( data [ 0 ] )
327- element . append . apply (
328- element ,
329- concat . apply ( [ ] , sub . map ( view => view . topNodes ) )
330- ) ;
331- }
332306}
0 commit comments