We used to have a separate `directive` instruction for instantiating directives. However, such an instruction requires that directives are created in the correct order, which would require that template compiler would have knowledge of all dependent directives. This would break template compilation locality principle. This change only changes the APIs to expected form but does not change the semantics. The semantics will need to be corrected in subsequent commits. The semantic change needed is to resolve the directive instantiation error at runtime based on injection dependencies. PR Close #21374
46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {D, E, b, defineDirective, e, p} from '../../src/render3/index';
|
|
|
|
import {renderToHtml} from './render_util';
|
|
|
|
describe('directive', () => {
|
|
|
|
describe('host', () => {
|
|
|
|
it('should support host bindings in directives', () => {
|
|
let directiveInstance: Directive|undefined;
|
|
|
|
class Directive {
|
|
klass = 'foo';
|
|
static ngDirectiveDef = defineDirective({
|
|
type: Directive,
|
|
factory: () => directiveInstance = new Directive,
|
|
refresh: (directiveIndex: number, elementIndex: number) => {
|
|
p(elementIndex, 'className', b(D<Directive>(directiveIndex).klass));
|
|
}
|
|
});
|
|
}
|
|
|
|
function Template(ctx: any, cm: boolean) {
|
|
if (cm) {
|
|
E(0, 'span', null, [Directive]);
|
|
e();
|
|
}
|
|
Directive.ngDirectiveDef.r(1, 0);
|
|
}
|
|
|
|
expect(renderToHtml(Template, {})).toEqual('<span class="foo"></span>');
|
|
directiveInstance !.klass = 'bar';
|
|
expect(renderToHtml(Template, {})).toEqual('<span class="bar"></span>');
|
|
});
|
|
|
|
});
|
|
});
|