# Breaking Changes
## Migrating
### Migration Guide
If you aren't sure where to start in upgrading to v4, we recommend reading through our [migration guide](https://beta.ionicframework.com/docs/building/migration) first.
### Migration Linter
Looking for a tool that automatically warns (and sometimes fixes) the breaking changes listed? Check out our [migration linter](https://github.com/ionic-team/v4-migration-tslint)!
## Components
A list of the breaking changes introduced to each component in Ionic Angular v4.
- [Action Sheet](#action-sheet)
- [Alert](#alert)
- [Back Button](#back-button)
- [Button](#button)
- [Chip](#chip)
- [Colors](#colors)
- [Content](#content)
- [Datetime](#datetime)
- [Dynamic Mode](#dynamic-mode)
- [FAB](#fab)
- [Fixed Content](#fixed-content)
- [Grid](#grid)
- [Icon](#icon)
- [Infinite Scroll](#infinite-scroll)
- [Item](#item)
- [Item Divider](#item-divider)
- [Item Options](#item-options)
- [Item Sliding](#item-sliding)
- [Label](#label)
- [List Header](#list-header)
- [Loading](#loading)
- [Menu](#menu)
- [Menu Toggle](#menu-toggle)
- [Modal](#modal)
- [Nav](#nav)
- [Navbar](#navbar)
- [Option](#option)
- [Overlays](#overlays)
- [Radio](#radio)
- [Range](#range)
- [Refresher](#refresher)
- [Scroll](#scroll)
- [Segment](#segment)
- [Select](#select)
- [Spinner](#spinner)
- [Tabs](#tabs)
- [Text / Typography](#text--typography)
- [Theming](#theming)
- [Toolbar](#toolbar)
## Action Sheet
The `title`, `subTitle` and `enableBackdropDismiss` properties has been renamed to `header`, `subHeader` and `backdropDismiss` respectively.
**Old Usage Example:**
```js
const actionSheet = await actionSheetCtrl.create({
title: 'This is the title',
subTitle: 'this is the sub title',
enableBackdropDismiss: false
});
await actionSheet.present();
```
**New Usage Example:**
```js
const actionSheet = await actionSheetCtrl.create({
header: 'This is the title',
subHeader: 'this is the sub title',
backdropDismiss: false
});
await actionSheet.present();
```
## Alert
The `title`, `subTitle` and `enableBackdropDismiss` properties has been renamed to `header`, `subHeader` and `backdropDismiss` respectivelly.
**Old Usage Example:**
```js
const alert = await alertCtrl.create({
title: 'This is the title',
subTitle: 'this is the sub title',
enableBackdropDismiss: false
});
await alert.present();
```
**New Usage Example:**
```js
const alert = await alertCtrl.create({
header: 'This is the title',
subHeader: 'this is the sub title',
backdropDismiss: false
});
await alert.present();
```
## Back Button
The back button is no longer added by default to a navigation bar. It should be explicitly written in a toolbar:
**Old Usage Example:**
```html
Back Button Example
```
**New Usage Example:**
```html
Back Button Example
```
See the [back button documentation](https://github.com/ionic-team/ionic/blob/master/core/src/components/back-button) for more usage examples.
## Button
### Markup Changed
Button should now be written as an `` element. Ionic will determine when to render an anchor tag based on the presence of an `href` attribute.
**Old Usage Example:**
```html
Default Anchor
```
**New Usage Example:**
```html
Default Button
Default Anchor
```
### Attributes Renamed
Previously to style icons inside of a button the following attributes were used: `icon-left`, `icon-right`, (and with the added support of RTL) `icon-start`, `icon-end`.
These have been renamed to the following, and moved from the button element to the icon itself:
| Old Property | New Property | Property Behavior |
|---------------------------|----------------|-----------------------------------------------------------------------|
| `icon-left`, `icon-start` | `slot="start"` | Positions to the left of the button in LTR, and to the right in RTL. |
| `icon-right`, `icon-end` | `slot="end"` | Positions to the right of the button in LTR, and to the left in RTL. |
In addition, several sets of mutually exclusive boolean attributes have been combined into a single string attribute.
The `small` and `large` attributes are now combined under the `size` attribute. The `clear`, `outline`, and `solid` attributes have been combined under `fill`. And, lastly, the `full` and `block` attributes have been combined under `expand`.
| Old Property | New Property | Property Behavior |
| --------------------------- | ------------ | --------------------------- |
| `small`, `large` | `size` | Sets the button size. |
| `clear`, `outline`, `solid` | `fill` | Sets the button fill style. |
| `full`, `block` | `expand` | Sets the button width. |
**Old Usage Example:**
```html
Icon Left
Icon Left on LTR, Right on RTL
Icon Right
Icon Right on LTR, Left on RTL
Large Button
Outline Button
Full-width Button
```
**New Usage Example:**
```html
Icon Left on LTR, Right on RTL
Icon Right on LTR, Left on RTL
Large Button
Outline Button
Full-width Button
```
## Chip
### Markup Changed
Buttons inside of an `` container should now be written as an `` element. Ionic will determine when to render an anchor tag based on the presence of an `href` attribute.
**Old Usage Example:**
```html
Default
```
**New Usage Example:**
```html
Default
```
## Colors
The default Ionic theme colors have changed. Previously we had:
```
primary: #327eff
secondary: #32db64
danger: #f53d3d
light: #f4f4f4
dark: #222
```
Some of their values have changed and we now include more colors by default:
```
primary: #3880ff
secondary: #0cd1e8
tertiary: #7044ff
success: #10dc60
warning: #ffce00
danger: #f04141
light: #f4f5f8
medium: #989aa2
dark: #222428
```
The `secondary` color saw the largest change. If you were previously using our `secondary` color we recommend switching to `success` instead.
## Content
Content is now a drop-in replacement for `ion-scroll`, that means `ion-content` is much more flexible today, they can be used anywhere, even in a nested fashion.
### resize() was removed
In Ionic 4, `ion-content` layout is based in flex, that means their size will automatically adjust without requiring to call resize() programatically.
### Attributes Renamed
| Old Property | New Property | Property Behavior |
|--------------|-----------------------|-------------------------------------------------------------------------|
| no-bounce | forceOverflow="false" | If true and the content does not cause an overflow scroll, the scroll interaction will cause a bounce. |
## Datetime
The Datetime classes and interfaces have changed capitalization from `DateTime` to `Datetime`. This is more consistent with other components and their tags.
**Old Usage Example:**
```javascript
import { DateTime } from 'ionic-angular';
```
**New Usage Example:**
```javascript
import { Datetime } from '@ionic/angular';
```
## Dynamic Mode
Components are no longer able to have their mode changed dynamically. You can change the mode before the first render, but after that it will not style properly because only the initial mode's styles are included.
## FAB
### Markup Changed
Buttons inside of an `` container should now be written as an `` element. Ionic will determine when to render an anchor tag based on the presence of an `href` attribute.
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
```
### Attributes Renamed
The mutually exclusive boolean attributes to position the fab have been combined into two single string attributes.
The attributes to align the fab horizontally are now combined under the `horizontal` attribute and the attributes to align the fab vertically are now combined under the `vertical` attribute:
| Old Property | New Property | Property Behavior |
|--------------|----------------------|-------------------------------------------------------------------------|
| left | Removed | |
| right | Removed | |
| center | `horizontal="center"`| Positions to the center of the viewport. |
| start | `horizontal="start"` | Positions to the left of the viewport in LTR, and to the right in RTL. |
| end | `horizontal="end"` | Positions to the right of the viewport in LTR, and to the left in RTL. |
| top | `vertical="top"` | Positions at the top of the viewport. |
| bottom | `vertical="bottom"` | Positions at the bottom of the viewport. |
| middle | `vertical="center"` | Positions at the center of the viewport. |
_Note that `middle` has been changed to `center` for the vertical positioning._
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
```
## Fixed Content
The `` container was previously placed inside of the fixed content by default. Now, any fixed content should use the `fixed` slot.
**Old Usage Example:**
```html
Scrollable Content
```
**New Usage Example:**
```html
Scrollable Content
```
## Grid
### Markup Changed
The Grid has been refactored in order to support css variables and a dynamic number of columns. The following column attributes have been changed.
_In the following examples, `{breakpoint}` refers to the optional screen breakpoint (xs, sm, md, lg, xl) and `{value}` refers to the number of columns._
- `col-{breakpoint}-{value}` attributes have been renamed to `size-{breakpoint}=“{value}”`
- `offset-{breakpoint}-{value}` attributes have been renamed to `offset-{breakpoint}=“{value}”`
- `push-{breakpoint}-{value}` attributes have been renamed to `push-{breakpoint}=“{value}”`
- `pull-{breakpoint}-{value}` attributes have been renamed to `pull-{breakpoint}=“{value}”`
Customizing the padding and width of a grid should now be done with css variables. For more information, see [Grid Layout](https://github.com/ionic-team/ionic-docs/blob/master/src/content/layout/grid.md).
## Icon
### Fonts Removed
Icons have been refactored to use SVGs instead of fonts. Ionic will only fetch the SVG for the icon when it is needed, instead of having a large font file that is always loaded in.
If any `CSS` is being overridden for an icon it will need to change to override the SVG itself. Below is a usage example of the differences in changing the icon color.
**Old Usage Example:**
```css
.icon {
color: #000;
}
```
**New Usage Example:**
```css
ion-icon {
fill: #000;
}
```
_Note: we are no longer adding the `icon` class to an `ion-icon`, so the element should be targeted instead._
### Property Removed
The `isActive` property has been removed. It only worked for `ios` icons previously. If you would like to switch between an outline and solid icon you should set it in the `name`, or `ios`/`md` attribute and then change it when needed.
## Infinite Scroll
### Method Removed
The `enable()` method has been removed in favor of using the `disabled` property on the `ion-infinite-scroll` element.
**Old Usage Example:**
```html
```
```javascript
doInfinite(infiniteScroll) {
console.log('Begin async operation');
setTimeout(() => {
console.log('Async operation has ended');
infiniteScroll.complete();
// To disable the infinite scroll
infiniteScroll.enable(false);
}, 500);
}
```
**New Usage Example:**
```html
```
```javascript
doInfinite(event) {
console.log('Begin async operation');
setTimeout(() => {
console.log('Async operation has ended');
event.target.complete();
// To disable the infinite scroll
event.target.disabled = true;
}, 500);
}
```
## Item
### Markup Changed
Item should now be written as an `` element. Ionic will determine when to render an anchor tag based on the presence of an `href` attribute, and a button tag based on the presence of an `onclick` or `button` attribute. Otherwise, it will render a div.
**Old Usage Example:**
```html
Default Item
Anchor Item
```
**New Usage Example:**
```html
Default Item
Button Item
Anchor Item
```
### Label Required
Previously an `ion-label` would automatically get added to an `ion-item` if one wasn't provided. Now an `ion-label` should always be added if the component is used to display text.
```html
Item Label
```
### Attributes Renamed
Previously to position elements inside of an `ion-item` the following attributes were used: `item-left`, `item-right`, (and with the added support of RTL) `item-start`, `item-end`.
These have been renamed to the following:
| Old Property | New Property | Property Behavior |
|---------------------------|----------------|---------------------------------------------------------------------|
| `item-left`, `item-start` | `slot="start"` | Positions to the left of the item in LTR, and to the right in RTL. |
| `item-right`, `item-end` | `slot="end"` | Positions to the right of the item in LTR, and to the left in RTL. |
**Old Usage Example:**
```html
Left
Item Label
Right
Left on LTR, Right on RTL
Item Label
Right on LTR, Left on RTL
```
**New Usage Example:**
```html
Left on LTR, Right on RTL
Item Label
Right on LTR, Left on RTL
```
### Detail Push
The attributes to show/hide the detail arrows on items have been converted to a single property and value. Instead of writing `detail-push` or `detail-none` to show/hide the arrow, it should be written `detail`/`detail="true"` or `detail="false"`.
**Old Usage Example:**
```html
Item Label
```
**New Usage Example:**
```html
Item LabelItem Label
```
By default, items that render buttons or anchor tags will show the arrow in `ios` mode.
## Item Divider
### Label Required
Previously an `ion-label` would automatically get added to an `ion-item-divider` if one wasn't provided. Now an `ion-label` should always be added if the component is used to display text.
```html
Item Divider Label
```
## Item Options
### Attributes Renamed
Previously to position the item options inside of an `ion-item-sliding` the `side` attribute would be used with one of the following values: `"left"`, `"right"`.
These values have been renamed to `"start"` and `"end"` to better align with our support for RTL.
| Old Value | New Value |
|-----------------|-----------------|
| `side="left"` | `side="start"` |
| `side="right"` | `side="end"` |
## Item Sliding
### Markup Changed
The option component should not be written as a `button` with an `ion-button` directive anymore. It should be written as an `ion-item-option`. This will render a native button element inside of it.
**Old Usage Example:**
```html
Item 1
```
**New Usage Example:**
```html
Item 1
```
### Method Renamed
The `getSlidingPercent` method has been renamed to `getSlidingRatio` since the function is returning a ratio of the open amount of the item compared to the width of the options.
## Label
### Attributes Renamed
The attributes to set label position for input are now combined under the `position` attribute:
| Old Property | New Property | Property Behavior |
|--------------|----------------------|------------------------------------------------------------------------------|
| fixed | `position="fixed"` | A persistent label that sits next the input. |
| floating | `position="floating"`| A label that will float above the input if the input is empty or loses focus.|
| stacked | `position="stacked"` | A stacked label will always appear on top of the input. |
**Old Usage Example:**
```html
Floating LabelFixed Label
```
**New Usage Example:**
```html
Floating LabelFixed Label
```
## List Header
### Label Required
Previously an `ion-label` would automatically get added to an `ion-list-header` if one wasn't provided. Now an `ion-label` should always be added if the component is used to display text.
```html
List Header Label
```
## Loading
`dismissOnPageChange` was removed. Fortunatelly all the navigation API is promise based and there are global events (`ionNavWillChange`) you can listen in order to detect when navigation occurs.
You should take advantage of these APIs in order to dismiss your loading overlay explicitally.
## Menu
### Prop renamed
The `swipeEnabled` prop has been renamed to `swipeGesture`.
The `content` prop has been renamed to `contentId` and it points to the DOM id of the content:
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
```
## Menu Toggle
### Markup Changed
The `menuToggle` attribute should not be added to an element anymore. Elements that should toggle a menu should be wrapped in an `ion-menu-toggle` element.
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
Toggle Menu
```
## Modal
### Arguments Changed
The component is no longer the first argument in the `create` method. Instead, a single argument of type `ModalOptions` is passed in with a `component` property and the value is the component as part of the passed object.
**Old Usage Example:**
```javascript
import { Component } from '@angular/core';
import { ModalController } from 'ionic-angular';
import { ModalPage } from './modal-page';
@Component({
...
})
export class MyPage {
constructor(public modalCtrl: ModalController) { }
presentModal() {
const modal = this.modalCtrl.create(ModalPage);
modal.present();
}
}
```
**New Usage Example:**
```javascript
import { Component } from '@angular/core';
import { ModalController } from '@ionic/angular';
import { ModalPage } from './modal-page';
@Component({
...
})
export class MyPage {
constructor(public modalCtrl: ModalController) { }
async presentModal() {
const modal = await this.modalCtrl.create({
component: ModalPage
});
return await modal.present();
}
}
```
## Nav
### Method renamed
The `remove` method has been renamed to `removeIndex` to avoid conflicts with HTML and be more descriptive as to what it does.
The `getActiveChildNavs` method has been renamed to `getChildNavs`.
### Prop renamed
The `swipeBackEnabled` prop has been renamed to `swipeGesture`.
## Navbar
The `` component has been removed in favor of always using an `` with an added back button:
**Old Usage Example:**
```html
My Navigation Bar
```
**New Usage Example:**
```html
My Navigation Bar
```
See the [back button](#back-button) changes for more information.
## Option
### Markup Changed
Select's option element should now be written as ``. This makes it more obvious that the element should only be used with a Select.
**Old Usage Example:**
```html
Option 1Option 2Option 3
```
**New Usage Example:**
```html
Option 1Option 2Option 3
```
### Class Changed
The class has been renamed from `Option` to `SelectOption` to keep it consistent with the element tag name.
## Overlays
### Markup Changed
Action Sheet, Alert, Loading, Modal, Popover, and Toast:
- Should now use `async`/`await`
- `enableBackdropDismiss` has been renamed to `backdropDismiss`.
**Old Usage Example:**
```javascript
presentPopover(ev: any) {
const popover = this.popoverController.create({
component: PopoverComponent,
event: event,
translucent: true,
enableBackdropDismiss: false
});
popover.present();
}
```
**New Usage Example:**
```javascript
async presentPopover(ev: any) {
const popover = await this.popoverController.create({
component: PopoverComponent,
event: event,
translucent: true,
backdropDismiss: false
});
return await popover.present();
}
```
## Radio
### Slot Required
Previously radio was positioned inside of an item automatically or by using `item-left`/`item-right`. It is now required to have a `slot` to be positioned properly.
**Old Usage Example:**
```html
AppleGrape, checked, disabledCherry
```
**New Usage Example:**
```html
AppleGrape, checked, disabledCherry
```
### Radio Group
Radio group has been changed to an element. It should now be wrapped around any `` elements as ``.
**Old Usage Example:**
```html
AppleGrape, checked, disabledCherry
```
**New Usage Example:**
```html
AppleGrape, checked, disabledCherry
```
## Range
### Attributes Renamed
Previously to place content inside of a range the following attributes were used: `range-left`, `range-right`, (and with the added support of RTL) `range-start`, `range-end`.
These have been renamed to the following:
| Old Property | New Property | Property Behavior |
|-----------------------------|----------------|-----------------------------------------------------------------------|
| `range-left`, `range-start` | `slot="start"` | Positions to the left of the range in LTR, and to the right in RTL. |
| `range-right`, `range-end` | `slot="end"` | Positions to the right of the range in LTR, and to the left in RTL. |
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
```
## Refresher
The `enabled` property (with a default value of `true`) has been renamed to `disabled` (with a default value of `false`).
**Old Usage Example:**
```html
...
```
**New Usage Example:**
```html
...
```
## Scroll
`ion-scroll` has been removed, fortunatelly `ion-content` can work as a drop-in replacement:
```diff
-
+
```
Another very good option is to style a `div` to become scrollable using CSS:
```css
div.scrollable {
overflow: scroll
}
```
## Segment
The markup hasn't changed for Segments, but now writing `` will render a native button element inside of it.
## Select
The `selectOptions` property was renamed to `interfaceOptions` since it directly correlates with the `interface` property.
**Old Usage Example:**
```html
...
```
```ts
this.customOptions = {
title: 'Pizza Toppings',
subTitle: 'Select your toppings'
};
```
**New Usage Example:**
```html
...
```
```ts
this.customOptions = {
title: 'Pizza Toppings',
subTitle: 'Select your toppings'
};
```
## Spinner
### Name Changed
The `ios` and `ios-small` spinner's have been renamed to `lines` and `lines-small`, respectively. This also applies to any components that use spinner: `ion-loading`, `ion-infinite-scroll`, `ion-refresher`.
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
```
## Tabs
### Attributes Renamed
#### `ion-tabs`
The attributes to position the tabs, change the tab layout, enable the tab highlight and hide the tabs have been renamed.
| Old Property | New Property | Notes |
|---------------------|----------------------|-------------------------------------------------|
| `tabsHighlight` | `tabbarHighlight` | |
| `tabsLayout` | `tabbarLayout` | Value `title-hide` was renamed to `label-hide` |
| `tabsPlacement` | `tabbarPlacement` | |
| `hidden` | `tabbarHidden` | |
**Old Usage Example:**
```html
...
```
**New Usage Example:**
```html
...
```
#### `ion-tab`
The attributes for the tab title, icon, and badge customization have been renamed.
| Old Property | New Property |
|---------------------|----------------------|
| `tabTitle` | `label` |
| `tabIcon` | `icon` |
| `tabBadge` | `badge` |
| `tabBadgeStyle` | `badgeColor` |
| `enabled` | `disabled` |
| `tabUrlPath` | `href` |
**Old Usage Example:**
```html
```
**New Usage Example:**
```html
```
## Text / Typography
### Markup Changed
Typography should now be written as an `` element. Previously the `ion-text` attribute could be added to any HTML element to set its color. It should now be used as a wrapper around the HTML elements to style.
**Old Usage Example:**
```html