declare module '@ember/controller' { import { FrameworkObject } from '@ember/object/-internals'; import type { DecoratorPropertyDescriptor, ElementDescriptor } from '@ember/-internals/metal'; import Mixin from '@ember/object/mixin'; import type { RouteArgs } from '@ember/routing/-internals'; import { ActionHandler } from '@ember/-internals/runtime'; import type { Transition } from 'router_js'; export type ControllerQueryParamType = 'boolean' | 'number' | 'array' | 'string'; export type ControllerQueryParam = | string | Record< string, { type: ControllerQueryParamType; } > | Record; /** @module @ember/controller */ /** @class ControllerMixin @namespace Ember @uses Ember.ActionHandler @private */ interface ControllerMixin extends ActionHandler { /** @internal */ _qpDelegate: unknown | null; isController: true; /** The object to which actions from the view should be sent. For example, when a Handlebars template uses the `{{action}}` helper, it will attempt to send the action to the view's controller's `target`. By default, the value of the target property is set to the router, and is injected when a controller is instantiated. This injection is applied as part of the application's initialization process. In most cases the `target` property will automatically be set to the logical consumer of actions for the controller. @property target @default null @public */ target: unknown | null; /** The controller's current model. When retrieving or modifying a controller's model, this property should be used instead of the `content` property. @property model @public */ model: T; /** Defines which query parameters the controller accepts. If you give the names `['category','page']` it will bind the values of these query parameters to the variables `this.category` and `this.page`. By default, query parameters are parsed as strings. This may cause unexpected behavior if a query parameter is used with `toggleProperty`, because the initial value set for `param=false` will be the string `"false"`, which is truthy. To avoid this, you may specify that the query parameter should be parsed as a boolean by using the following verbose form with a `type` property: ```javascript queryParams: [{ category: { type: 'boolean' } }] ``` Available values for the `type` parameter are `'boolean'`, `'number'`, `'array'`, and `'string'`. If query param type is not specified, it will default to `'string'`. @for Ember.ControllerMixin @property queryParams @public */ queryParams: Readonly>; /** Transition the application into another route. The route may be either a single route or route path: ```javascript aController.transitionToRoute('blogPosts'); aController.transitionToRoute('blogPosts.recentEntries'); ``` Optionally supply a model for the route in question. The model will be serialized into the URL using the `serialize` hook of the route: ```javascript aController.transitionToRoute('blogPost', aPost); ``` If a literal is passed (such as a number or a string), it will be treated as an identifier instead. In this case, the `model` hook of the route will be triggered: ```javascript aController.transitionToRoute('blogPost', 1); ``` Multiple models will be applied last to first recursively up the route tree. ```app/router.js Router.map(function() { this.route('blogPost', { path: ':blogPostId' }, function() { this.route('blogComment', { path: ':blogCommentId', resetNamespace: true }); }); }); ``` ```javascript aController.transitionToRoute('blogComment', aPost, aComment); aController.transitionToRoute('blogComment', 1, 13); ``` It is also possible to pass a URL (a string that starts with a `/`). ```javascript aController.transitionToRoute('/'); aController.transitionToRoute('/blog/post/1/comment/13'); aController.transitionToRoute('/blog/posts?sort=title'); ``` An options hash with a `queryParams` property may be provided as the final argument to add query parameters to the destination URL. ```javascript aController.transitionToRoute('blogPost', 1, { queryParams: { showComments: 'true' } }); // if you just want to transition the query parameters without changing the route aController.transitionToRoute({ queryParams: { sort: 'date' } }); ``` See also [replaceRoute](/ember/release/classes/Ember.ControllerMixin/methods/replaceRoute?anchor=replaceRoute). @for Ember.ControllerMixin @method transitionToRoute @deprecated Use transitionTo from the Router service instead. @param {String} [name] the name of the route or a URL @param {...Object} models the model(s) or identifier(s) to be used while transitioning to the route. @param {Object} [options] optional hash with a queryParams property containing a mapping of query parameters @return {Transition} the transition object associated with this attempted transition @public */ transitionToRoute(...args: RouteArgs): Transition; /** Transition into another route while replacing the current URL, if possible. This will replace the current history entry instead of adding a new one. Beside that, it is identical to `transitionToRoute` in all other respects. ```javascript aController.replaceRoute('blogPosts'); aController.replaceRoute('blogPosts.recentEntries'); ``` Optionally supply a model for the route in question. The model will be serialized into the URL using the `serialize` hook of the route: ```javascript aController.replaceRoute('blogPost', aPost); ``` If a literal is passed (such as a number or a string), it will be treated as an identifier instead. In this case, the `model` hook of the route will be triggered: ```javascript aController.replaceRoute('blogPost', 1); ``` Multiple models will be applied last to first recursively up the route tree. ```app/router.js Router.map(function() { this.route('blogPost', { path: ':blogPostId' }, function() { this.route('blogComment', { path: ':blogCommentId', resetNamespace: true }); }); }); ``` ``` aController.replaceRoute('blogComment', aPost, aComment); aController.replaceRoute('blogComment', 1, 13); ``` It is also possible to pass a URL (a string that starts with a `/`). ```javascript aController.replaceRoute('/'); aController.replaceRoute('/blog/post/1/comment/13'); ``` @for Ember.ControllerMixin @method replaceRoute @deprecated Use replaceWith from the Router service instead. @param {String} [name] the name of the route or a URL @param {...Object} models the model(s) or identifier(s) to be used while transitioning to the route. @param {Object} [options] optional hash with a queryParams property containing a mapping of query parameters @return {Transition} the transition object associated with this attempted transition @public */ replaceRoute(...args: RouteArgs): Transition; } const ControllerMixin: Mixin; /** @class Controller @extends EmberObject @uses Ember.ControllerMixin @public */ interface Controller<_T = unknown> extends FrameworkObject, ControllerMixin<_T> {} const Controller_base: Readonly & (new ( owner?: import('@ember/-internals/owner').default | undefined ) => import('@ember/object').default) & Mixin; class Controller<_T = unknown> extends Controller_base {} /** Creates a property that lazily looks up another controller in the container. Can only be used when defining another controller. Example: ```app/controllers/post.js import Controller, { inject as controller } from '@ember/controller'; export default class PostController extends Controller { @controller posts; } ``` Classic Class Example: ```app/controllers/post.js import Controller, { inject as controller } from '@ember/controller'; export default Controller.extend({ posts: controller() }); ``` This example will create a `posts` property on the `post` controller that looks up the `posts` controller in the container, making it easy to reference other controllers. @method inject @static @for @ember/controller @since 1.10.0 @param {String} name (optional) name of the controller to inject, defaults to the property's name @return {ComputedDecorator} injection decorator instance @public */ export function inject(name: string): PropertyDecorator; export function inject(...args: [ElementDescriptor[0], ElementDescriptor[1]]): void; export function inject(...args: ElementDescriptor): DecoratorPropertyDescriptor; export function inject(): PropertyDecorator; export { Controller as default, ControllerMixin }; /** A type registry for Ember `Controller`s. Meant to be declaration-merged so string lookups resolve to the correct type. Blueprints should include such a declaration merge for TypeScript: ```ts import Controller from '@ember/controller'; export default class ExampleController extends Controller { // ... } declare module '@ember/controller' { export interface Registry { example: ExampleController; } } ``` Then `@inject` can check that the service is registered correctly, and APIs like `owner.lookup('controller:example')` can return `ExampleController`. */ export interface Registry extends Record {} }