parent
							
								
									dd7910347a
								
							
						
					
					
						commit
						b50edfd1f3
					
				
							
								
								
									
										38
									
								
								modules/angular2/src/directives/ng_style.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								modules/angular2/src/directives/ng_style.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | ||||
| import {Directive, onCheck} from 'angular2/annotations'; | ||||
| import {ElementRef} from 'angular2/core'; | ||||
| import {Pipe} from 'angular2/src/change_detection/pipes/pipe'; | ||||
| import {PipeRegistry} from 'angular2/src/change_detection/pipes/pipe_registry'; | ||||
| import {KeyValueChanges} from 'angular2/src/change_detection/pipes/keyvalue_changes'; | ||||
| import {isPresent, print} from 'angular2/src/facade/lang'; | ||||
| import {Renderer} from 'angular2/src/render/api'; | ||||
| 
 | ||||
| @Directive({selector: '[ng-style]', lifecycle: [onCheck], properties: ['rawStyle: ng-style']}) | ||||
| export class NgStyle { | ||||
|   _pipe: Pipe; | ||||
|   _rawStyle; | ||||
| 
 | ||||
|   constructor(private _pipeRegistry: PipeRegistry, private _ngEl: ElementRef, | ||||
|               private _renderer: Renderer) {} | ||||
| 
 | ||||
|   set rawStyle(v) { | ||||
|     this._rawStyle = v; | ||||
|     this._pipe = this._pipeRegistry.get('keyValDiff', this._rawStyle); | ||||
|   } | ||||
| 
 | ||||
|   onCheck() { | ||||
|     var diff = this._pipe.transform(this._rawStyle); | ||||
|     if (isPresent(diff) && isPresent(diff.wrapped)) { | ||||
|       this._applyChanges(diff.wrapped); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   private _applyChanges(diff: KeyValueChanges): void { | ||||
|     diff.forEachAddedItem((record) => { this._setStyle(record.key, record.currentValue); }); | ||||
|     diff.forEachChangedItem((record) => { this._setStyle(record.key, record.currentValue); }); | ||||
|     diff.forEachRemovedItem((record) => { this._setStyle(record.key, null); }); | ||||
|   } | ||||
| 
 | ||||
|   private _setStyle(name: string, val: string): void { | ||||
|     this._renderer.setElementStyle(this._ngEl, name, val); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										126
									
								
								modules/angular2/test/directives/ng_style_spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								modules/angular2/test/directives/ng_style_spec.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | ||||
| import { | ||||
|   AsyncTestCompleter, | ||||
|   beforeEach, | ||||
|   beforeEachBindings, | ||||
|   ddescribe, | ||||
|   xdescribe, | ||||
|   describe, | ||||
|   el, | ||||
|   expect, | ||||
|   iit, | ||||
|   inject, | ||||
|   it, | ||||
|   xit, | ||||
| } from 'angular2/test_lib'; | ||||
| 
 | ||||
| import {StringMapWrapper} from 'angular2/src/facade/collection'; | ||||
| 
 | ||||
| import {Component, View} from 'angular2/angular2'; | ||||
| 
 | ||||
| import {TestBed} from 'angular2/src/test_lib/test_bed'; | ||||
| import {DOM} from 'angular2/src/dom/dom_adapter'; | ||||
| import {NgStyle} from 'angular2/src/directives/ng_style'; | ||||
| 
 | ||||
| export function main() { | ||||
|   describe('binding to CSS styles', () => { | ||||
| 
 | ||||
|     it('should add styles specified in an object literal', | ||||
|        inject([TestBed, AsyncTestCompleter], (tb: TestBed, async) => { | ||||
|          var template = `<div [ng-style]="{'text-align': 'right'}"></div>`; | ||||
| 
 | ||||
|          tb.createView(TestComponent, {html: template}) | ||||
|              .then((view) => { | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual('right'); | ||||
| 
 | ||||
|                async.done(); | ||||
|              }); | ||||
|        })); | ||||
| 
 | ||||
|     it('should add and change styles specified in an object expression', | ||||
|        inject([TestBed, AsyncTestCompleter], (tb: TestBed, async) => { | ||||
|          var template = `<div [ng-style]="expr"></div>`; | ||||
| 
 | ||||
|          tb.createView(TestComponent, {html: template}) | ||||
|              .then((view) => { | ||||
|                var expr: Map<string, any>; | ||||
| 
 | ||||
|                view.context.expr = {'text-align': 'right'}; | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual('right'); | ||||
| 
 | ||||
|                expr = view.context.expr; | ||||
|                expr['text-align'] = 'left'; | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual('left'); | ||||
| 
 | ||||
|                async.done(); | ||||
|              }); | ||||
|        })); | ||||
| 
 | ||||
|     it('should remove styles when deleting a key in an object expression', | ||||
|        inject([TestBed, AsyncTestCompleter], (tb: TestBed, async) => { | ||||
|          var template = `<div [ng-style]="expr"></div>`; | ||||
| 
 | ||||
|          tb.createView(TestComponent, {html: template}) | ||||
|              .then((view) => { | ||||
|                view.context.expr = {'text-align': 'right'}; | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual('right'); | ||||
| 
 | ||||
|                StringMapWrapper.delete(view.context.expr, 'text-align'); | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual(''); | ||||
| 
 | ||||
|                async.done(); | ||||
|              }); | ||||
|        })); | ||||
| 
 | ||||
|     it('should co-operate with the style attribute', | ||||
|        inject([TestBed, AsyncTestCompleter], (tb: TestBed, async) => { | ||||
|          var template = `<div style="font-size: 12px" [ng-style]="expr"></div>`; | ||||
| 
 | ||||
|          tb.createView(TestComponent, {html: template}) | ||||
|              .then((view) => { | ||||
|                view.context.expr = {'text-align': 'right'}; | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual('right'); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'font-size')).toEqual('12px'); | ||||
| 
 | ||||
|                StringMapWrapper.delete(view.context.expr, 'text-align'); | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual(''); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'font-size')).toEqual('12px'); | ||||
| 
 | ||||
|                async.done(); | ||||
|              }); | ||||
|        })); | ||||
| 
 | ||||
|     it('should co-operate with the style.[styleName]="expr" special-case in the compiler', | ||||
|        inject([TestBed, AsyncTestCompleter], (tb: TestBed, async) => { | ||||
|          var template = `<div [style.font-size.px]="12" [ng-style]="expr"></div>`; | ||||
| 
 | ||||
|          tb.createView(TestComponent, {html: template}) | ||||
|              .then((view) => { | ||||
|                view.context.expr = {'text-align': 'right'}; | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual('right'); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'font-size')).toEqual('12px'); | ||||
| 
 | ||||
|                StringMapWrapper.delete(view.context.expr, 'text-align'); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'font-size')).toEqual('12px'); | ||||
| 
 | ||||
|                view.detectChanges(); | ||||
|                expect(DOM.getStyle(view.rootNodes[0], 'text-align')).toEqual(''); | ||||
| 
 | ||||
|                async.done(); | ||||
|              }); | ||||
|        })); | ||||
|   }) | ||||
| } | ||||
| 
 | ||||
| @Component({selector: 'test-cmp'}) | ||||
| @View({directives: [NgStyle]}) | ||||
| class TestComponent { | ||||
|   expr; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user