refactor(pipes): use Injector instead of pipe factories for pipe instantiation

BREAKING CHANGE
    - Pipe factories have been removed.
    - PIpe names to pipe implementations are 1-to-1  instead of 1-to-*

 Before:
     class DateFormatter {
         transform(date, args){}
     }

     class DateFormatterFactory {
       supporst(obj) { return true; }
       create(cdRef) { return new DateFormatter(); }
     }
     new Pipes({date: [new DateFormatterFactory()]})

After
    class DateFormatter {
      transform(date, args){}
    }
    new Pipes({date: DateFormatter})
This commit is contained in:
vsavkin
2015-08-06 10:39:02 -07:00
parent 06da60f4b7
commit 2dcf714d2b
28 changed files with 249 additions and 524 deletions

View File

@ -35,7 +35,13 @@ import {
CONST,
CONST_EXPR
} from 'angular2/src/facade/lang';
import {PromiseWrapper, EventEmitter, ObservableWrapper} from 'angular2/src/facade/async';
import {
PromiseWrapper,
EventEmitter,
ObservableWrapper,
PromiseCompleter,
Promise
} from 'angular2/src/facade/async';
import {
Injector,
@ -50,7 +56,6 @@ import {
SkipSelfMetadata
} from 'angular2/di';
import {
PipeFactory,
Pipes,
defaultPipes,
Pipe,
@ -673,6 +678,34 @@ export function main() {
async.done();
})}));
if (DOM.supportsDOMEvents()) {
it('should be checked when an async pipe requests a check',
inject([TestComponentBuilder], fakeAsync((tcb: TestComponentBuilder) => {
tcb = tcb.overrideView(MyComp, new viewAnn.View({
template: '<push-cmp-with-async #cmp></push-cmp-with-async>',
directives: [[[PushCmpWithAsyncPipe]]]
}));
var rootTC;
tcb.createAsync(MyComp).then(root => { rootTC = root; });
tick();
var cmp = rootTC.componentViewChildren[0].getLocal('cmp');
rootTC.detectChanges();
expect(cmp.numberOfChecks).toEqual(1);
rootTC.detectChanges();
rootTC.detectChanges();
expect(cmp.numberOfChecks).toEqual(1);
cmp.resolve(2);
tick();
rootTC.detectChanges();
expect(cmp.numberOfChecks).toEqual(2);
})));
}
});
it('should create a component that injects an @Host',
@ -1607,9 +1640,30 @@ class PushCmpWithRef {
propagate() { this.ref.requestCheck(); }
}
@Component({selector: 'push-cmp-with-async', changeDetection: ON_PUSH})
@View({template: '{{field | async}}'})
@Injectable()
class PushCmpWithAsyncPipe {
numberOfChecks: number = 0;
promise: Promise<any>;
completer: PromiseCompleter<any>;
constructor() {
this.completer = PromiseWrapper.completer();
this.promise = this.completer.promise;
}
get field() {
this.numberOfChecks++;
return this.promise;
}
resolve(value) { this.completer.resolve(value); }
}
@Injectable()
class PipesWithDouble extends Pipes {
constructor() { super({"double": [new DoublePipeFactory()]}); }
constructor(injector: Injector) { super({"double": DoublePipe}, injector); }
}
@Component({
@ -1703,19 +1757,9 @@ class SomeViewport {
@Injectable()
class DoublePipe implements Pipe {
onDestroy() {}
supports(obj) { return true; }
transform(value, args = null) { return `${value}${value}`; }
}
@Injectable()
class DoublePipeFactory implements PipeFactory {
supports(obj) { return true; }
create(cdRef) { return new DoublePipe(); }
}
@Directive({selector: '[emitter]', events: ['event']})
@Injectable()
class DirectiveEmitingEvent {