fix(ivy): correct query read logic after merges (#21749)

PR Close #21749
This commit is contained in:
Pawel Kozlowski
2018-01-24 15:33:45 +01:00
committed by Misko Hevery
parent ab69f12e2c
commit 6245637e81
2 changed files with 24 additions and 27 deletions

View File

@ -226,8 +226,8 @@ function geIdxOfMatchingDirective(node: LNode, type: Type<any>): number|null {
} }
function readFromNodeInjector( function readFromNodeInjector(
nodeInjector: LInjector, node: LNode, read: QueryReadType<any>| Type<any>| null, nodeInjector: LInjector, node: LNode, read: QueryReadType<any>| Type<any>,
directiveIdx: number = -1): any { directiveIdx: number): any {
if (read instanceof ReadFromInjectorFn) { if (read instanceof ReadFromInjectorFn) {
return read.read(nodeInjector, node, directiveIdx); return read.read(nodeInjector, node, directiveIdx);
} else { } else {
@ -246,13 +246,12 @@ function add(predicate: QueryPredicate<any>| null, node: LNode) {
if (type) { if (type) {
const directiveIdx = geIdxOfMatchingDirective(node, type); const directiveIdx = geIdxOfMatchingDirective(node, type);
if (directiveIdx !== null) { if (directiveIdx !== null) {
if (predicate.read !== null) { // a node is matching a predicate - determine what to read
const requestedRead = readFromNodeInjector(nodeInjector, node, predicate.read); // if read token and / or strategy is not specified, use type as read token
if (requestedRead !== null) { const result =
addMatch(predicate, requestedRead); readFromNodeInjector(nodeInjector, node, predicate.read || type, directiveIdx);
} if (result !== null) {
} else { addMatch(predicate, result);
addMatch(predicate, node.view.data[directiveIdx]);
} }
} }
} else { } else {
@ -260,15 +259,13 @@ function add(predicate: QueryPredicate<any>| null, node: LNode) {
for (let i = 0; i < selector.length; i++) { for (let i = 0; i < selector.length; i++) {
ngDevMode && assertNotNull(node.tNode, 'node.tNode'); ngDevMode && assertNotNull(node.tNode, 'node.tNode');
const directiveIdx = getIdxOfMatchingSelector(node.tNode !, selector[i]); const directiveIdx = getIdxOfMatchingSelector(node.tNode !, selector[i]);
// is anything on a node matching a selector?
if (directiveIdx !== null) { if (directiveIdx !== null) {
if (predicate.read !== null) { // a node is matching a predicate - determine what to read
const result = readFromNodeInjector(nodeInjector, node, predicate.read !, directiveIdx); // note that queries using name selector must specify read strategy
if (result !== null) { ngDevMode && assertNotNull(predicate.read, 'predicate.read');
addMatch(predicate, result); const result = readFromNodeInjector(nodeInjector, node, predicate.read !, directiveIdx);
} if (result !== null) {
} else { addMatch(predicate, result);
addMatch(predicate, node.view.data[directiveIdx]);
} }
} }
} }

View File

@ -161,7 +161,7 @@ describe('query', () => {
describe('local names predicate', () => { describe('local names predicate', () => {
it('should query for a single element and read ElementRef', () => { it('should query for a single element and read ElementRef by default', () => {
let elToQuery; let elToQuery;
/** /**
@ -174,7 +174,7 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo'], false, QUERY_READ_ELEMENT_REF)); m(0, Q(['foo'], false, QUERY_READ_FROM_NODE));
elToQuery = E(1, 'div', null, null, ['foo', '']); elToQuery = E(1, 'div', null, null, ['foo', '']);
e(); e();
E(2, 'div'); E(2, 'div');
@ -189,7 +189,7 @@ describe('query', () => {
expect(query.first.nativeElement).toEqual(elToQuery); expect(query.first.nativeElement).toEqual(elToQuery);
}); });
it('should query for multiple elements and read ElementRef', () => { it('should query for multiple elements and read ElementRef by default', () => {
let el1ToQuery; let el1ToQuery;
let el2ToQuery; let el2ToQuery;
@ -204,7 +204,7 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo', 'bar'], undefined, QUERY_READ_ELEMENT_REF)); m(0, Q(['foo', 'bar'], undefined, QUERY_READ_FROM_NODE));
el1ToQuery = E(1, 'div', null, null, ['foo', '']); el1ToQuery = E(1, 'div', null, null, ['foo', '']);
e(); e();
E(2, 'div'); E(2, 'div');
@ -330,7 +330,7 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo'], undefined, QUERY_READ_TEMPLATE_REF)); m(0, Q(['foo'], undefined, QUERY_READ_FROM_NODE));
C(1, undefined, undefined, undefined, undefined, ['foo', '']); C(1, undefined, undefined, undefined, undefined, ['foo', '']);
} }
qR(tmp = m<QueryList<any>>(0)) && (ctx.query = tmp as QueryList<any>); qR(tmp = m<QueryList<any>>(0)) && (ctx.query = tmp as QueryList<any>);
@ -378,7 +378,7 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo'])); m(0, Q(['foo'], true, QUERY_READ_FROM_NODE));
E(1, Child, null, null, ['foo', '']); E(1, Child, null, null, ['foo', '']);
{ childInstance = m(2); } { childInstance = m(2); }
e(); e();
@ -406,7 +406,7 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo'])); m(0, Q(['foo'], true, QUERY_READ_FROM_NODE));
E(1, 'div', null, [Child], ['foo', 'child']); E(1, 'div', null, [Child], ['foo', 'child']);
childInstance = m(2); childInstance = m(2);
e(); e();
@ -434,7 +434,7 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo', 'bar'])); m(0, Q(['foo', 'bar'], true, QUERY_READ_FROM_NODE));
E(1, 'div', null, [Child1, Child2], ['foo', 'child1', 'bar', 'child2']); E(1, 'div', null, [Child1, Child2], ['foo', 'child1', 'bar', 'child2']);
{ {
child1Instance = m(2); child1Instance = m(2);
@ -783,8 +783,8 @@ describe('query', () => {
const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) { const Cmpt = createComponent('cmpt', function(ctx: any, cm: boolean) {
let tmp: any; let tmp: any;
if (cm) { if (cm) {
m(0, Q(['foo'], true)); m(0, Q(['foo'], true, QUERY_READ_FROM_NODE));
m(1, Q(['foo'], false)); m(1, Q(['foo'], false, QUERY_READ_FROM_NODE));
C(2); C(2);
E(3, 'span', null, null, ['foo', '']); E(3, 'span', null, null, ['foo', '']);
e(); e();