diff --git a/packages/animations/browser/src/dsl/animation_timeline_builder.ts b/packages/animations/browser/src/dsl/animation_timeline_builder.ts
index 78f70b84f6..f0332c9e5b 100644
--- a/packages/animations/browser/src/dsl/animation_timeline_builder.ts
+++ b/packages/animations/browser/src/dsl/animation_timeline_builder.ts
@@ -556,7 +556,11 @@ export class AnimationTimelineContext {
}
if (selector.length > 0) { // if :self is only used then the selector is empty
const multi = limit != 1;
- results.push(...this._driver.query(this.element, selector, multi));
+ let elements = this._driver.query(this.element, selector, multi);
+ if (limit !== 0) {
+ elements = elements.slice(0, limit);
+ }
+ results.push(...elements);
}
if (!optional && results.length == 0) {
diff --git a/packages/core/test/animation/animation_query_integration_spec.ts b/packages/core/test/animation/animation_query_integration_spec.ts
index 3ba4be8afb..a0ebbc9a80 100644
--- a/packages/core/test/animation/animation_query_integration_spec.ts
+++ b/packages/core/test/animation/animation_query_integration_spec.ts
@@ -461,8 +461,8 @@ export function main() {
selector: 'ani-cmp',
template: `
-
-
+
+
`,
animations: [
@@ -587,8 +587,8 @@ export function main() {
selector: 'ani-cmp',
template: `
-
-
+
+
`,
animations: [
@@ -640,9 +640,9 @@ export function main() {
template: `
+ {{ item }}
+
+
`,
animations: [
trigger(
@@ -706,9 +706,9 @@ export function main() {
template: `
+ {{ item }}
+
+
`,
animations: [trigger(
'myAnimation',
@@ -809,8 +809,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [trigger(
@@ -923,8 +923,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [trigger(
@@ -1111,8 +1111,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [trigger(
@@ -1333,8 +1333,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [trigger(
@@ -1385,8 +1385,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [trigger(
@@ -1436,8 +1436,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [
@@ -1519,8 +1519,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [trigger(
@@ -1569,8 +1569,8 @@ export function main() {
template: `
- {{ item }}
-
+ {{ item }}
+
`,
animations: [
@@ -1713,6 +1713,56 @@ export function main() {
expect(players[1].element.innerText.trim()).toEqual('5');
expect(players[2].element.innerText.trim()).toEqual('6');
});
+
+ describe('options.limit', () => {
+ it('should limit results when a limit value is passed into the query options', () => {
+ @Component({
+ selector: 'cmp',
+ template: `
+
+ `,
+ animations: [
+ trigger(
+ 'myAnimation',
+ [
+ transition(
+ '* => go',
+ [
+ query(
+ '.item',
+ [
+ style({opacity: 0}),
+ animate('1s', style({opacity: 1})),
+ ],
+ {limit: 2}),
+ ]),
+ ]),
+ ]
+ })
+ class Cmp {
+ public exp: any;
+ public items: any[] = [];
+ }
+
+ TestBed.configureTestingModule({declarations: [Cmp]});
+ const fixture = TestBed.createComponent(Cmp);
+ const cmp = fixture.componentInstance;
+ cmp.items = ['a', 'b', 'c', 'd', 'e'];
+ fixture.detectChanges();
+
+ cmp.exp = 'go';
+ fixture.detectChanges();
+
+ const players = getLog() as any[];
+ expect(players.length).toEqual(2);
+ expect(players[0].element.innerText.trim()).toEqual('a');
+ expect(players[1].element.innerText.trim()).toEqual('b');
+ });
+ });
});
describe('sub triggers', () => {
@@ -2314,7 +2364,7 @@ export function main() {
-
+
`
})
class Cmp {