@@ -110,9 +110,12 @@ function jqLiteWrap(element) {
110
110
if ( isString ( element ) ) {
111
111
var div = document . createElement ( 'div' ) ;
112
112
div . innerHTML = element ;
113
- element = div . childNodes [ 0 ] ;
113
+ element = new JQLite ( div . childNodes ) ;
114
+ } else if ( element instanceof JQLite ) {
115
+ } else if ( isElement ( element ) ) {
116
+ element = new JQLite ( element ) ;
114
117
}
115
- return element instanceof JQLite ? element : new JQLite ( element ) ;
118
+ return element ;
116
119
}
117
120
function isUndefined ( value ) { return typeof value == 'undefined' ; }
118
121
function isDefined ( value ) { return typeof value != 'undefined' ; }
@@ -126,6 +129,10 @@ function lowercase(value){ return isString(value) ? value.toLowerCase() : value;
126
129
function uppercase ( value ) { return isString ( value ) ? value . toUpperCase ( ) : value ; }
127
130
function trim ( value ) { return isString ( value ) ? value . replace ( / ^ \s * / , '' ) . replace ( / \s * $ / , '' ) : value ; }
128
131
function nodeName ( element ) { return ( element [ 0 ] || element ) . nodeName ; }
132
+ function isElement ( node ) {
133
+ if ( node && node [ 0 ] ) node = node [ 0 ] ;
134
+ return node && node . nodeName ;
135
+ }
129
136
130
137
function isVisible ( element ) {
131
138
var rect = element [ 0 ] . getBoundingClientRect ( ) ;
@@ -209,14 +216,6 @@ function consoleLog(level, objs) {
209
216
consoleNode . appendChild ( log ) ;
210
217
}
211
218
212
- function isNode ( inp ) {
213
- return inp &&
214
- inp . tagName &&
215
- inp . nodeName &&
216
- inp . ownerDocument &&
217
- inp . removeAttribute ;
218
- }
219
-
220
219
function isLeafNode ( node ) {
221
220
if ( node ) {
222
221
switch ( node . nodeName ) {
@@ -1843,7 +1842,15 @@ function jqClearData(element) {
1843
1842
}
1844
1843
1845
1844
function JQLite ( element ) {
1846
- this [ 0 ] = element ;
1845
+ if ( element . length && element . item ) {
1846
+ for ( var i = 0 ; i < element . length ; i ++ ) {
1847
+ this [ i ] = element [ i ] ;
1848
+ }
1849
+ this . length = element . length ;
1850
+ } else {
1851
+ this [ 0 ] = element ;
1852
+ this . length = 1 ;
1853
+ }
1847
1854
}
1848
1855
1849
1856
JQLite . prototype = {
@@ -1920,7 +1927,11 @@ JQLite.prototype = {
1920
1927
} ,
1921
1928
1922
1929
append : function ( node ) {
1923
- this [ 0 ] . appendChild ( jqLite ( node ) [ 0 ] ) ;
1930
+ var self = this [ 0 ] ;
1931
+ node = jqLite ( node ) ;
1932
+ foreach ( node , function ( child ) {
1933
+ self . appendChild ( child ) ;
1934
+ } ) ;
1924
1935
} ,
1925
1936
1926
1937
remove : function ( ) {
@@ -2351,28 +2362,6 @@ defineApi('Date', [angularGlobal, angularDate], []);
2351
2362
angular [ 'Date' ] [ 'toString' ] = angularDate [ 'toString' ] ;
2352
2363
defineApi ( 'Function' , [ angularGlobal , angularCollection , angularFunction ] ,
2353
2364
[ 'bind' , 'bindAll' , 'delay' , 'defer' , 'wrap' , 'compose' ] ) ;
2354
- angularFilter . Meta = function ( obj ) {
2355
- if ( obj ) {
2356
- for ( var key in obj ) {
2357
- this [ key ] = obj [ key ] ;
2358
- }
2359
- }
2360
- } ;
2361
- angularFilter . Meta . get = function ( obj , attr ) {
2362
- attr = attr || 'text' ;
2363
- switch ( typeof obj ) {
2364
- case "string" :
2365
- return attr == "text" ? obj : undefined ;
2366
- case "object" :
2367
- if ( obj && typeof obj [ attr ] !== "undefined" ) {
2368
- return obj [ attr ] ;
2369
- }
2370
- return undefined ;
2371
- default :
2372
- return obj ;
2373
- }
2374
- } ;
2375
-
2376
2365
var angularFilterGoogleChartApi ;
2377
2366
2378
2367
foreach ( {
@@ -2445,31 +2434,33 @@ foreach({
2445
2434
if ( ! returnValue && regexp . test ( tNo ) ) {
2446
2435
var text = carrier . name + ": " + trackingNo ;
2447
2436
var url = carrier . url + trackingNo ;
2448
- returnValue = new angularFilter . Meta ( {
2449
- text :text ,
2450
- url :url ,
2451
- html : '<a href="' + escapeAttr ( url ) + '">' + text + '</a>' ,
2452
- trackingNo :trackingNo } ) ;
2437
+ returnValue = jqLite ( '<a></a>' ) ;
2438
+ returnValue . text ( text ) ;
2439
+ returnValue . attr ( 'href' , url ) ;
2453
2440
}
2454
2441
} ) ;
2455
2442
} ) ;
2456
2443
if ( returnValue )
2457
2444
return returnValue ;
2458
2445
else if ( trackingNo )
2459
- return noMatch || new angularFilter . Meta ( { text : trackingNo + " is not recognized" } ) ;
2446
+ return noMatch || trackingNo + " is not recognized" ;
2460
2447
else
2461
2448
return null ;
2462
2449
} ; } ) ( ) ,
2463
2450
2464
2451
'link' : function ( obj , title ) {
2465
- var text = title || angularFilter . Meta . get ( obj ) ;
2466
- var url = angularFilter . Meta . get ( obj , "url" ) || angularFilter . Meta . get ( obj ) ;
2467
- if ( url ) {
2468
- if ( angular . validator . email ( url ) === null ) {
2469
- url = "mailto:" + url ;
2452
+ if ( obj ) {
2453
+ var text = title || obj . text || obj ;
2454
+ var url = obj . url || obj ;
2455
+ if ( url ) {
2456
+ if ( angular . validator . email ( url ) === null ) {
2457
+ url = "mailto:" + url ;
2458
+ }
2459
+ var a = jqLite ( '<a></a>' ) ;
2460
+ a . attr ( 'href' , url ) ;
2461
+ a . text ( text ) ;
2462
+ return a ;
2470
2463
}
2471
- var html = '<a href="' + escapeHtml ( url ) + '">' + text + '</a>' ;
2472
- return new angularFilter . Meta ( { text :text , url :url , html :html } ) ;
2473
2464
}
2474
2465
return obj ;
2475
2466
} ,
@@ -2496,31 +2487,27 @@ foreach({
2496
2487
2497
2488
'image' : function ( obj , width , height ) {
2498
2489
if ( obj && obj . url ) {
2499
- var style = "" ;
2490
+ var style = "" , img = jqLite ( '<img>' ) ;
2500
2491
if ( width ) {
2501
- style = ' style=" max-width: ' + width +
2502
- 'px; max-height: ' + ( height || width ) + 'px;"' ;
2492
+ img . css ( ' max-width' , width + 'px' ) ;
2493
+ img . css ( ' max-height' , ( height || width ) + 'px' ) ;
2503
2494
}
2504
- return new angularFilter . Meta ( { url : obj . url , text : obj . url ,
2505
- html : '< img src="' + obj . url + '"' + style + '/>' } ) ;
2495
+ img . attr ( 'src' , obj . url ) ;
2496
+ return img ;
2506
2497
}
2507
2498
return null ;
2508
2499
} ,
2509
2500
2510
- 'lowercase' : function ( obj ) {
2511
- var text = angularFilter . Meta . get ( obj ) ;
2512
- return text ? ( "" + text ) . toLowerCase ( ) : text ;
2513
- } ,
2501
+ 'lowercase' : lowercase ,
2514
2502
2515
- 'uppercase' : function ( obj ) {
2516
- var text = angularFilter . Meta . get ( obj ) ;
2517
- return text ? ( "" + text ) . toUpperCase ( ) : text ;
2518
- } ,
2503
+ 'uppercase' : uppercase ,
2519
2504
2520
2505
'linecount' : function ( obj ) {
2521
- var text = angularFilter . Meta . get ( obj ) ;
2522
- if ( text === '' || ! text ) return 1 ;
2523
- return text . split ( / \n | \f / ) . length ;
2506
+ if ( isString ( obj ) ) {
2507
+ if ( obj === '' ) return 1 ;
2508
+ return obj . split ( / \n | \f / ) . length ;
2509
+ }
2510
+ return 1 ;
2524
2511
} ,
2525
2512
2526
2513
'if' : function ( result , expression ) {
@@ -2589,8 +2576,9 @@ foreach({
2589
2576
'encode' : function ( params , width , height ) {
2590
2577
width = width || 200 ;
2591
2578
height = height || width ;
2592
- var url = "http://chart.apis.google.com/chart?" ;
2593
- var urlParam = [ ] ;
2579
+ var url = "http://chart.apis.google.com/chart?" ,
2580
+ urlParam = [ ] ,
2581
+ img = jqLite ( '<img>' ) ;
2594
2582
params [ 'chs' ] = width + "x" + height ;
2595
2583
foreach ( params , function ( value , key ) {
2596
2584
if ( value ) {
@@ -2599,8 +2587,9 @@ foreach({
2599
2587
} ) ;
2600
2588
urlParam . sort ( ) ;
2601
2589
url += urlParam . join ( "&" ) ;
2602
- return new angularFilter . Meta ( { url :url ,
2603
- html :'<img width="' + width + '" height="' + height + '" src="' + url + '"/>' } ) ;
2590
+ img . attr ( 'src' , url ) ;
2591
+ img . css ( { width : width + 'px' , height : height + 'px' } ) ;
2592
+ return img ;
2604
2593
}
2605
2594
}
2606
2595
) ,
@@ -2644,7 +2633,7 @@ foreach({
2644
2633
} ,
2645
2634
2646
2635
'html' : function ( html ) {
2647
- return new angularFilter . Meta ( { html : html } ) ;
2636
+ return jqLite ( html ) ;
2648
2637
} ,
2649
2638
2650
2639
'linky' : function ( text ) {
@@ -2666,7 +2655,7 @@ foreach({
2666
2655
raw = raw . substring ( i + url . length ) ;
2667
2656
}
2668
2657
html . push ( escapeHtml ( raw ) ) ;
2669
- return new angularFilter . Meta ( { text : text , html : html . join ( '' ) } ) ;
2658
+ return jqLite ( html . join ( '' ) ) ;
2670
2659
}
2671
2660
} , function ( v , k ) { angularFilter [ k ] = v ; } ) ;
2672
2661
@@ -2832,14 +2821,23 @@ angularDirective("ng-eval", function(expression){
2832
2821
} ) ;
2833
2822
2834
2823
angularDirective ( "ng-bind" , function ( expression ) {
2835
- var templateFn = compileBindTemplate ( "{{" + expression + "}}" ) ;
2836
2824
return function ( element ) {
2837
- var lastValue ;
2825
+ var lastValue , lastError ;
2838
2826
this . $onEval ( function ( ) {
2839
- var value = templateFn . call ( this , element ) ;
2840
- if ( value != lastValue ) {
2841
- element . text ( value ) ;
2827
+ var error , value = this . $tryEval ( expression , function ( e ) {
2828
+ error = toJson ( e ) ;
2829
+ } ) ;
2830
+ if ( value != lastValue || error != lastError ) {
2842
2831
lastValue = value ;
2832
+ lastError = error ;
2833
+ elementError ( element , NG_EXCEPTION , error ) ;
2834
+ if ( error ) value = error ;
2835
+ if ( isElement ( value ) ) {
2836
+ element . html ( '' ) ;
2837
+ element . append ( value ) ;
2838
+ } else {
2839
+ element . text ( value ) ;
2840
+ }
2843
2841
}
2844
2842
} , element ) ;
2845
2843
} ;
@@ -2866,7 +2864,10 @@ function compileBindTemplate(template){
2866
2864
var parts = [ ] , self = this ;
2867
2865
foreach ( bindings , function ( fn ) {
2868
2866
var value = fn . call ( self , element ) ;
2869
- if ( isObject ( value ) ) value = toJson ( value , true ) ;
2867
+ if ( isElement ( value ) )
2868
+ value = '' ;
2869
+ else if ( isObject ( value ) )
2870
+ value = toJson ( value , true ) ;
2870
2871
parts . push ( value ) ;
2871
2872
} ) ;
2872
2873
return parts . join ( '' ) ;
0 commit comments