devextreme-angular 17.2.17 → 17.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (834) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +603 -603
  3. package/core/component.d.ts +59 -59
  4. package/core/component.js +175 -175
  5. package/core/component.js.map +1 -1
  6. package/core/events-strategy.d.ts +35 -35
  7. package/core/events-strategy.js +111 -111
  8. package/core/events-strategy.js.map +1 -1
  9. package/core/iterable-differ-helper.d.ts +26 -26
  10. package/core/iterable-differ-helper.js +73 -73
  11. package/core/iterable-differ-helper.js.map +1 -1
  12. package/core/nested-option.d.ts +70 -70
  13. package/core/nested-option.js +201 -201
  14. package/core/nested-option.js.map +1 -1
  15. package/core/template-host.d.ts +21 -21
  16. package/core/template-host.js +27 -27
  17. package/core/template-host.js.map +1 -1
  18. package/core/template.d.ts +31 -31
  19. package/core/template.js +100 -100
  20. package/core/template.js.map +1 -1
  21. package/core/utils.d.ts +16 -16
  22. package/core/utils.js +51 -51
  23. package/core/utils.js.map +1 -1
  24. package/core/watcher-helper.d.ts +20 -20
  25. package/core/watcher-helper.js +82 -82
  26. package/core/watcher-helper.js.map +1 -1
  27. package/index.d.ts +91 -91
  28. package/index.js +96 -96
  29. package/index.js.map +1 -1
  30. package/package.json +3 -3
  31. package/ui/accordion.d.ts +313 -313
  32. package/ui/accordion.js +596 -596
  33. package/ui/accordion.js.map +1 -1
  34. package/ui/action-sheet.d.ts +233 -233
  35. package/ui/action-sheet.js +446 -446
  36. package/ui/action-sheet.js.map +1 -1
  37. package/ui/all.d.ts +14 -14
  38. package/ui/all.js +244 -244
  39. package/ui/all.js.map +1 -1
  40. package/ui/autocomplete.d.ts +487 -487
  41. package/ui/autocomplete.js +911 -911
  42. package/ui/autocomplete.js.map +1 -1
  43. package/ui/bar-gauge.d.ts +301 -301
  44. package/ui/bar-gauge.js +556 -556
  45. package/ui/bar-gauge.js.map +1 -1
  46. package/ui/box.d.ts +203 -203
  47. package/ui/box.js +383 -383
  48. package/ui/box.js.map +1 -1
  49. package/ui/bullet.d.ts +197 -197
  50. package/ui/bullet.js +393 -393
  51. package/ui/bullet.js.map +1 -1
  52. package/ui/button.d.ts +201 -201
  53. package/ui/button.js +409 -409
  54. package/ui/button.js.map +1 -1
  55. package/ui/calendar.d.ts +288 -288
  56. package/ui/calendar.js +620 -620
  57. package/ui/calendar.js.map +1 -1
  58. package/ui/chart.d.ts +881 -881
  59. package/ui/chart.js +1158 -1158
  60. package/ui/chart.js.map +1 -1
  61. package/ui/check-box.d.ts +213 -213
  62. package/ui/check-box.js +450 -450
  63. package/ui/check-box.js.map +1 -1
  64. package/ui/circular-gauge.d.ts +285 -285
  65. package/ui/circular-gauge.js +552 -552
  66. package/ui/circular-gauge.js.map +1 -1
  67. package/ui/color-box.d.ts +365 -365
  68. package/ui/color-box.js +682 -682
  69. package/ui/color-box.js.map +1 -1
  70. package/ui/context-menu.d.ts +357 -357
  71. package/ui/context-menu.js +698 -698
  72. package/ui/context-menu.js.map +1 -1
  73. package/ui/data-grid.d.ts +659 -659
  74. package/ui/data-grid.js +1290 -1290
  75. package/ui/data-grid.js.map +1 -1
  76. package/ui/date-box.d.ts +529 -529
  77. package/ui/date-box.js +1019 -1019
  78. package/ui/date-box.js.map +1 -1
  79. package/ui/defer-rendering.d.ts +182 -182
  80. package/ui/defer-rendering.js +366 -366
  81. package/ui/defer-rendering.js.map +1 -1
  82. package/ui/drop-down-box.d.ts +403 -403
  83. package/ui/drop-down-box.js +792 -792
  84. package/ui/drop-down-box.js.map +1 -1
  85. package/ui/file-uploader.d.ts +360 -360
  86. package/ui/file-uploader.js +728 -728
  87. package/ui/file-uploader.js.map +1 -1
  88. package/ui/filter-builder.d.ts +211 -211
  89. package/ui/filter-builder.js +475 -475
  90. package/ui/filter-builder.js.map +1 -1
  91. package/ui/form.d.ts +319 -319
  92. package/ui/form.js +677 -677
  93. package/ui/form.js.map +1 -1
  94. package/ui/funnel.d.ts +333 -333
  95. package/ui/funnel.js +639 -639
  96. package/ui/funnel.js.map +1 -1
  97. package/ui/gallery.d.ts +313 -313
  98. package/ui/gallery.js +606 -606
  99. package/ui/gallery.js.map +1 -1
  100. package/ui/linear-gauge.d.ts +285 -285
  101. package/ui/linear-gauge.js +555 -555
  102. package/ui/linear-gauge.js.map +1 -1
  103. package/ui/list.d.ts +561 -561
  104. package/ui/list.js +1050 -1050
  105. package/ui/list.js.map +1 -1
  106. package/ui/load-indicator.d.ts +101 -101
  107. package/ui/load-indicator.js +215 -215
  108. package/ui/load-indicator.js.map +1 -1
  109. package/ui/load-panel.d.ts +246 -246
  110. package/ui/load-panel.js +506 -506
  111. package/ui/load-panel.js.map +1 -1
  112. package/ui/lookup.d.ts +691 -691
  113. package/ui/lookup.js +1388 -1388
  114. package/ui/lookup.js.map +1 -1
  115. package/ui/map.d.ts +308 -308
  116. package/ui/map.js +551 -551
  117. package/ui/map.js.map +1 -1
  118. package/ui/menu.d.ts +359 -359
  119. package/ui/menu.js +678 -678
  120. package/ui/menu.js.map +1 -1
  121. package/ui/multi-view.d.ts +269 -269
  122. package/ui/multi-view.js +526 -526
  123. package/ui/multi-view.js.map +1 -1
  124. package/ui/nav-bar.d.ts +269 -269
  125. package/ui/nav-bar.js +514 -514
  126. package/ui/nav-bar.js.map +1 -1
  127. package/ui/nested/adapter.d.ts +26 -26
  128. package/ui/nested/adapter.js +144 -144
  129. package/ui/nested/adapter.js.map +1 -1
  130. package/ui/nested/adaptive-layout.d.ts +23 -23
  131. package/ui/nested/adaptive-layout.js +111 -111
  132. package/ui/nested/adaptive-layout.js.map +1 -1
  133. package/ui/nested/animation.d.ts +20 -20
  134. package/ui/nested/animation.js +93 -93
  135. package/ui/nested/animation.js.map +1 -1
  136. package/ui/nested/area-settings.d.ts +37 -37
  137. package/ui/nested/area-settings.js +265 -265
  138. package/ui/nested/area-settings.js.map +1 -1
  139. package/ui/nested/area.d.ts +20 -20
  140. package/ui/nested/area.js +137 -137
  141. package/ui/nested/area.js.map +1 -1
  142. package/ui/nested/argument-axis.d.ts +145 -145
  143. package/ui/nested/argument-axis.js +609 -609
  144. package/ui/nested/argument-axis.js.map +1 -1
  145. package/ui/nested/argument-format.d.ts +20 -20
  146. package/ui/nested/argument-format.js +84 -84
  147. package/ui/nested/argument-format.js.map +1 -1
  148. package/ui/nested/at.d.ts +22 -22
  149. package/ui/nested/at.js +100 -100
  150. package/ui/nested/at.js.map +1 -1
  151. package/ui/nested/background-image.d.ts +23 -23
  152. package/ui/nested/background-image.js +111 -111
  153. package/ui/nested/background-image.js.map +1 -1
  154. package/ui/nested/background.d.ts +24 -24
  155. package/ui/nested/background.js +122 -122
  156. package/ui/nested/background.js.map +1 -1
  157. package/ui/nested/bar.d.ts +20 -20
  158. package/ui/nested/bar.js +137 -137
  159. package/ui/nested/bar.js.map +1 -1
  160. package/ui/nested/base/animation-config.d.ts +30 -30
  161. package/ui/nested/base/animation-config.js +173 -173
  162. package/ui/nested/base/animation-config.js.map +1 -1
  163. package/ui/nested/base/box-options.d.ts +48 -48
  164. package/ui/nested/base/box-options.js +253 -253
  165. package/ui/nested/base/box-options.js.map +1 -1
  166. package/ui/nested/base/chart-common-series-settings.d.ts +79 -79
  167. package/ui/nested/base/chart-common-series-settings.js +673 -673
  168. package/ui/nested/base/chart-common-series-settings.js.map +1 -1
  169. package/ui/nested/base/chart-series-dxi.d.ts +58 -58
  170. package/ui/nested/base/chart-series-dxi.js +463 -463
  171. package/ui/nested/base/chart-series-dxi.js.map +1 -1
  172. package/ui/nested/base/context-menu-item-dxi.d.ts +94 -94
  173. package/ui/nested/base/context-menu-item-dxi.js +593 -593
  174. package/ui/nested/base/context-menu-item-dxi.js.map +1 -1
  175. package/ui/nested/base/data-grid-column-dxi.d.ts +77 -77
  176. package/ui/nested/base/data-grid-column-dxi.js +643 -643
  177. package/ui/nested/base/data-grid-column-dxi.js.map +1 -1
  178. package/ui/nested/base/filter-builder-field-dxi.d.ts +61 -61
  179. package/ui/nested/base/filter-builder-field-dxi.js +483 -483
  180. package/ui/nested/base/filter-builder-field-dxi.js.map +1 -1
  181. package/ui/nested/base/form-options.d.ts +54 -54
  182. package/ui/nested/base/form-options.js +413 -413
  183. package/ui/nested/base/form-options.js.map +1 -1
  184. package/ui/nested/base/form-simple-item.d.ts +30 -30
  185. package/ui/nested/base/form-simple-item.js +173 -173
  186. package/ui/nested/base/form-simple-item.js.map +1 -1
  187. package/ui/nested/base/format.d.ts +20 -20
  188. package/ui/nested/base/format.js +83 -83
  189. package/ui/nested/base/format.js.map +1 -1
  190. package/ui/nested/base/gauge-indicator.d.ts +34 -34
  191. package/ui/nested/base/gauge-indicator.js +223 -223
  192. package/ui/nested/base/gauge-indicator.js.map +1 -1
  193. package/ui/nested/base/pivot-grid-data-source.d.ts +71 -71
  194. package/ui/nested/base/pivot-grid-data-source.js +123 -123
  195. package/ui/nested/base/pivot-grid-data-source.js.map +1 -1
  196. package/ui/nested/base/popup-options.d.ts +70 -70
  197. package/ui/nested/base/popup-options.js +473 -473
  198. package/ui/nested/base/popup-options.js.map +1 -1
  199. package/ui/nested/base/position-config.d.ts +37 -37
  200. package/ui/nested/base/position-config.js +103 -103
  201. package/ui/nested/base/position-config.js.map +1 -1
  202. package/ui/nested/base/tab-panel-options.d.ts +65 -65
  203. package/ui/nested/base/tab-panel-options.js +423 -423
  204. package/ui/nested/base/tab-panel-options.js.map +1 -1
  205. package/ui/nested/base/text-box-options.d.ts +64 -64
  206. package/ui/nested/base/text-box-options.js +523 -523
  207. package/ui/nested/base/text-box-options.js.map +1 -1
  208. package/ui/nested/base/viz-font.d.ts +20 -20
  209. package/ui/nested/base/viz-font.js +83 -83
  210. package/ui/nested/base/viz-font.js.map +1 -1
  211. package/ui/nested/behavior.d.ts +27 -27
  212. package/ui/nested/behavior.js +155 -155
  213. package/ui/nested/behavior.js.map +1 -1
  214. package/ui/nested/border.d.ts +30 -30
  215. package/ui/nested/border.js +188 -188
  216. package/ui/nested/border.js.map +1 -1
  217. package/ui/nested/boundary-offset.d.ts +22 -22
  218. package/ui/nested/boundary-offset.js +100 -100
  219. package/ui/nested/boundary-offset.js.map +1 -1
  220. package/ui/nested/box.d.ts +23 -23
  221. package/ui/nested/box.js +115 -115
  222. package/ui/nested/box.js.map +1 -1
  223. package/ui/nested/break-dxi.d.ts +22 -22
  224. package/ui/nested/break-dxi.js +100 -100
  225. package/ui/nested/break-dxi.js.map +1 -1
  226. package/ui/nested/break-style.d.ts +23 -23
  227. package/ui/nested/break-style.js +111 -111
  228. package/ui/nested/break-style.js.map +1 -1
  229. package/ui/nested/bubble.d.ts +20 -20
  230. package/ui/nested/bubble.js +136 -136
  231. package/ui/nested/bubble.js.map +1 -1
  232. package/ui/nested/candlestick.d.ts +20 -20
  233. package/ui/nested/candlestick.js +136 -136
  234. package/ui/nested/candlestick.js.map +1 -1
  235. package/ui/nested/center-dxi.d.ts +22 -22
  236. package/ui/nested/center-dxi.js +100 -100
  237. package/ui/nested/center-dxi.js.map +1 -1
  238. package/ui/nested/chart.d.ts +35 -35
  239. package/ui/nested/chart.js +222 -222
  240. package/ui/nested/chart.js.map +1 -1
  241. package/ui/nested/col-count-by-screen.d.ts +24 -24
  242. package/ui/nested/col-count-by-screen.js +122 -122
  243. package/ui/nested/col-count-by-screen.js.map +1 -1
  244. package/ui/nested/col-dxi.d.ts +24 -24
  245. package/ui/nested/col-dxi.js +122 -122
  246. package/ui/nested/col-dxi.js.map +1 -1
  247. package/ui/nested/collision.d.ts +22 -22
  248. package/ui/nested/collision.js +100 -100
  249. package/ui/nested/collision.js.map +1 -1
  250. package/ui/nested/colorizer.d.ts +25 -25
  251. package/ui/nested/colorizer.js +133 -133
  252. package/ui/nested/colorizer.js.map +1 -1
  253. package/ui/nested/column-chooser.d.ts +28 -28
  254. package/ui/nested/column-chooser.js +166 -166
  255. package/ui/nested/column-chooser.js.map +1 -1
  256. package/ui/nested/column-dxi.d.ts +24 -24
  257. package/ui/nested/column-dxi.js +165 -165
  258. package/ui/nested/column-dxi.js.map +1 -1
  259. package/ui/nested/column-fixing.d.ts +22 -22
  260. package/ui/nested/column-fixing.js +100 -100
  261. package/ui/nested/column-fixing.js.map +1 -1
  262. package/ui/nested/common-axis-settings.d.ts +42 -42
  263. package/ui/nested/common-axis-settings.js +320 -320
  264. package/ui/nested/common-axis-settings.js.map +1 -1
  265. package/ui/nested/common-pane-settings.d.ts +22 -22
  266. package/ui/nested/common-pane-settings.js +100 -100
  267. package/ui/nested/common-pane-settings.js.map +1 -1
  268. package/ui/nested/common-series-settings.d.ts +20 -20
  269. package/ui/nested/common-series-settings.js +143 -143
  270. package/ui/nested/common-series-settings.js.map +1 -1
  271. package/ui/nested/connector.d.ts +24 -24
  272. package/ui/nested/connector.js +122 -122
  273. package/ui/nested/connector.js.map +1 -1
  274. package/ui/nested/constant-line-dxi.d.ts +27 -27
  275. package/ui/nested/constant-line-dxi.js +155 -155
  276. package/ui/nested/constant-line-dxi.js.map +1 -1
  277. package/ui/nested/constant-line-style.d.ts +26 -26
  278. package/ui/nested/constant-line-style.js +144 -144
  279. package/ui/nested/constant-line-style.js.map +1 -1
  280. package/ui/nested/control-bar.d.ts +27 -27
  281. package/ui/nested/control-bar.js +155 -155
  282. package/ui/nested/control-bar.js.map +1 -1
  283. package/ui/nested/crosshair.d.ts +57 -57
  284. package/ui/nested/crosshair.js +166 -166
  285. package/ui/nested/crosshair.js.map +1 -1
  286. package/ui/nested/data-prepare-settings.d.ts +23 -23
  287. package/ui/nested/data-prepare-settings.js +111 -111
  288. package/ui/nested/data-prepare-settings.js.map +1 -1
  289. package/ui/nested/data-source.d.ts +23 -23
  290. package/ui/nested/data-source.js +107 -107
  291. package/ui/nested/data-source.js.map +1 -1
  292. package/ui/nested/delay.d.ts +22 -22
  293. package/ui/nested/delay.js +100 -100
  294. package/ui/nested/delay.js.map +1 -1
  295. package/ui/nested/display-format.d.ts +20 -20
  296. package/ui/nested/display-format.js +84 -84
  297. package/ui/nested/display-format.js.map +1 -1
  298. package/ui/nested/drop-down-options.d.ts +23 -23
  299. package/ui/nested/drop-down-options.js +137 -137
  300. package/ui/nested/drop-down-options.js.map +1 -1
  301. package/ui/nested/editing.d.ts +34 -34
  302. package/ui/nested/editing.js +221 -221
  303. package/ui/nested/editing.js.map +1 -1
  304. package/ui/nested/export.d.ts +31 -31
  305. package/ui/nested/export.js +199 -199
  306. package/ui/nested/export.js.map +1 -1
  307. package/ui/nested/field-chooser.d.ts +28 -28
  308. package/ui/nested/field-chooser.js +166 -166
  309. package/ui/nested/field-chooser.js.map +1 -1
  310. package/ui/nested/field-dxi.d.ts +20 -20
  311. package/ui/nested/field-dxi.js +124 -124
  312. package/ui/nested/field-dxi.js.map +1 -1
  313. package/ui/nested/field-panel.d.ts +27 -27
  314. package/ui/nested/field-panel.js +155 -155
  315. package/ui/nested/field-panel.js.map +1 -1
  316. package/ui/nested/filter-operation-descriptions.d.ts +32 -32
  317. package/ui/nested/filter-operation-descriptions.js +210 -210
  318. package/ui/nested/filter-operation-descriptions.js.map +1 -1
  319. package/ui/nested/filter-row.d.ts +29 -29
  320. package/ui/nested/filter-row.js +177 -177
  321. package/ui/nested/filter-row.js.map +1 -1
  322. package/ui/nested/font.d.ts +20 -20
  323. package/ui/nested/font.js +84 -84
  324. package/ui/nested/font.js.map +1 -1
  325. package/ui/nested/form-item.d.ts +23 -23
  326. package/ui/nested/form-item.js +107 -107
  327. package/ui/nested/form-item.js.map +1 -1
  328. package/ui/nested/form.d.ts +23 -23
  329. package/ui/nested/form.js +131 -131
  330. package/ui/nested/form.js.map +1 -1
  331. package/ui/nested/format.d.ts +20 -20
  332. package/ui/nested/format.js +84 -84
  333. package/ui/nested/format.js.map +1 -1
  334. package/ui/nested/fullstackedarea.d.ts +20 -20
  335. package/ui/nested/fullstackedarea.js +136 -136
  336. package/ui/nested/fullstackedarea.js.map +1 -1
  337. package/ui/nested/fullstackedbar.d.ts +20 -20
  338. package/ui/nested/fullstackedbar.js +136 -136
  339. package/ui/nested/fullstackedbar.js.map +1 -1
  340. package/ui/nested/fullstackedline.d.ts +20 -20
  341. package/ui/nested/fullstackedline.js +136 -136
  342. package/ui/nested/fullstackedline.js.map +1 -1
  343. package/ui/nested/fullstackedspline.d.ts +20 -20
  344. package/ui/nested/fullstackedspline.js +136 -136
  345. package/ui/nested/fullstackedspline.js.map +1 -1
  346. package/ui/nested/fullstackedsplinearea.d.ts +20 -20
  347. package/ui/nested/fullstackedsplinearea.js +136 -136
  348. package/ui/nested/fullstackedsplinearea.js.map +1 -1
  349. package/ui/nested/geometry.d.ts +23 -23
  350. package/ui/nested/geometry.js +111 -111
  351. package/ui/nested/geometry.js.map +1 -1
  352. package/ui/nested/grid.d.ts +24 -24
  353. package/ui/nested/grid.js +122 -122
  354. package/ui/nested/grid.js.map +1 -1
  355. package/ui/nested/group-item-dxi.d.ts +32 -32
  356. package/ui/nested/group-item-dxi.js +199 -199
  357. package/ui/nested/group-item-dxi.js.map +1 -1
  358. package/ui/nested/group-operation-descriptions.d.ts +24 -24
  359. package/ui/nested/group-operation-descriptions.js +122 -122
  360. package/ui/nested/group-operation-descriptions.js.map +1 -1
  361. package/ui/nested/group-panel.d.ts +23 -23
  362. package/ui/nested/group-panel.js +111 -111
  363. package/ui/nested/group-panel.js.map +1 -1
  364. package/ui/nested/group.d.ts +27 -27
  365. package/ui/nested/group.js +155 -155
  366. package/ui/nested/group.js.map +1 -1
  367. package/ui/nested/grouping.d.ts +27 -27
  368. package/ui/nested/grouping.js +155 -155
  369. package/ui/nested/grouping.js.map +1 -1
  370. package/ui/nested/hatching.d.ts +24 -24
  371. package/ui/nested/hatching.js +122 -122
  372. package/ui/nested/hatching.js.map +1 -1
  373. package/ui/nested/header-filter.d.ts +29 -29
  374. package/ui/nested/header-filter.js +166 -166
  375. package/ui/nested/header-filter.js.map +1 -1
  376. package/ui/nested/height.d.ts +22 -22
  377. package/ui/nested/height.js +100 -100
  378. package/ui/nested/height.js.map +1 -1
  379. package/ui/nested/hide-event.d.ts +22 -22
  380. package/ui/nested/hide-event.js +100 -100
  381. package/ui/nested/hide-event.js.map +1 -1
  382. package/ui/nested/hide.d.ts +20 -20
  383. package/ui/nested/hide.js +89 -89
  384. package/ui/nested/hide.js.map +1 -1
  385. package/ui/nested/horizontal-line.d.ts +26 -26
  386. package/ui/nested/horizontal-line.js +144 -144
  387. package/ui/nested/horizontal-line.js.map +1 -1
  388. package/ui/nested/hover-style.d.ts +26 -26
  389. package/ui/nested/hover-style.js +144 -144
  390. package/ui/nested/hover-style.js.map +1 -1
  391. package/ui/nested/image.d.ts +33 -33
  392. package/ui/nested/image.js +122 -122
  393. package/ui/nested/image.js.map +1 -1
  394. package/ui/nested/indent.d.ts +22 -22
  395. package/ui/nested/indent.js +100 -100
  396. package/ui/nested/indent.js.map +1 -1
  397. package/ui/nested/item-dxi.d.ts +33 -33
  398. package/ui/nested/item-dxi.js +195 -195
  399. package/ui/nested/item-dxi.js.map +1 -1
  400. package/ui/nested/item.d.ts +23 -23
  401. package/ui/nested/item.js +111 -111
  402. package/ui/nested/item.js.map +1 -1
  403. package/ui/nested/key.d.ts +23 -23
  404. package/ui/nested/key.js +111 -111
  405. package/ui/nested/key.js.map +1 -1
  406. package/ui/nested/label.d.ts +65 -65
  407. package/ui/nested/label.js +485 -485
  408. package/ui/nested/label.js.map +1 -1
  409. package/ui/nested/layer-dxi.d.ts +50 -50
  410. package/ui/nested/layer-dxi.js +397 -397
  411. package/ui/nested/layer-dxi.js.map +1 -1
  412. package/ui/nested/legend-dxi.d.ts +48 -48
  413. package/ui/nested/legend-dxi.js +320 -320
  414. package/ui/nested/legend-dxi.js.map +1 -1
  415. package/ui/nested/legend.d.ts +47 -47
  416. package/ui/nested/legend.js +309 -309
  417. package/ui/nested/legend.js.map +1 -1
  418. package/ui/nested/line.d.ts +20 -20
  419. package/ui/nested/line.js +137 -137
  420. package/ui/nested/line.js.map +1 -1
  421. package/ui/nested/load-panel.d.ts +27 -27
  422. package/ui/nested/load-panel.js +155 -155
  423. package/ui/nested/load-panel.js.map +1 -1
  424. package/ui/nested/loading-indicator.d.ts +25 -25
  425. package/ui/nested/loading-indicator.js +122 -122
  426. package/ui/nested/loading-indicator.js.map +1 -1
  427. package/ui/nested/location-dxi.d.ts +27 -27
  428. package/ui/nested/location-dxi.js +155 -155
  429. package/ui/nested/location-dxi.js.map +1 -1
  430. package/ui/nested/lookup.d.ts +25 -25
  431. package/ui/nested/lookup.js +122 -122
  432. package/ui/nested/lookup.js.map +1 -1
  433. package/ui/nested/major-tick-interval.d.ts +27 -27
  434. package/ui/nested/major-tick-interval.js +155 -155
  435. package/ui/nested/major-tick-interval.js.map +1 -1
  436. package/ui/nested/major-tick.d.ts +28 -28
  437. package/ui/nested/major-tick.js +166 -166
  438. package/ui/nested/major-tick.js.map +1 -1
  439. package/ui/nested/margin.d.ts +24 -24
  440. package/ui/nested/margin.js +122 -122
  441. package/ui/nested/margin.js.map +1 -1
  442. package/ui/nested/marker-dxi.d.ts +39 -39
  443. package/ui/nested/marker-dxi.js +200 -200
  444. package/ui/nested/marker-dxi.js.map +1 -1
  445. package/ui/nested/marker-settings.d.ts +43 -43
  446. package/ui/nested/marker-settings.js +331 -331
  447. package/ui/nested/marker-settings.js.map +1 -1
  448. package/ui/nested/marker.d.ts +26 -26
  449. package/ui/nested/marker.js +144 -144
  450. package/ui/nested/marker.js.map +1 -1
  451. package/ui/nested/master-detail.d.ts +29 -29
  452. package/ui/nested/master-detail.js +122 -122
  453. package/ui/nested/master-detail.js.map +1 -1
  454. package/ui/nested/max-range.d.ts +29 -29
  455. package/ui/nested/max-range.js +177 -177
  456. package/ui/nested/max-range.js.map +1 -1
  457. package/ui/nested/menu-item-dxi.d.ts +22 -22
  458. package/ui/nested/menu-item-dxi.js +100 -100
  459. package/ui/nested/menu-item-dxi.js.map +1 -1
  460. package/ui/nested/min-range.d.ts +29 -29
  461. package/ui/nested/min-range.js +177 -177
  462. package/ui/nested/min-range.js.map +1 -1
  463. package/ui/nested/minor-grid.d.ts +24 -24
  464. package/ui/nested/minor-grid.js +122 -122
  465. package/ui/nested/minor-grid.js.map +1 -1
  466. package/ui/nested/minor-tick-interval.d.ts +29 -29
  467. package/ui/nested/minor-tick-interval.js +177 -177
  468. package/ui/nested/minor-tick-interval.js.map +1 -1
  469. package/ui/nested/minor-tick.d.ts +28 -28
  470. package/ui/nested/minor-tick.js +166 -166
  471. package/ui/nested/minor-tick.js.map +1 -1
  472. package/ui/nested/my.d.ts +22 -22
  473. package/ui/nested/my.js +100 -100
  474. package/ui/nested/my.js.map +1 -1
  475. package/ui/nested/offset.d.ts +22 -22
  476. package/ui/nested/offset.js +100 -100
  477. package/ui/nested/offset.js.map +1 -1
  478. package/ui/nested/operation-descriptions.d.ts +31 -31
  479. package/ui/nested/operation-descriptions.js +199 -199
  480. package/ui/nested/operation-descriptions.js.map +1 -1
  481. package/ui/nested/overlapping-behavior.d.ts +25 -25
  482. package/ui/nested/overlapping-behavior.js +133 -133
  483. package/ui/nested/overlapping-behavior.js.map +1 -1
  484. package/ui/nested/pager.d.ts +26 -26
  485. package/ui/nested/pager.js +144 -144
  486. package/ui/nested/pager.js.map +1 -1
  487. package/ui/nested/paging.d.ts +23 -23
  488. package/ui/nested/paging.js +111 -111
  489. package/ui/nested/paging.js.map +1 -1
  490. package/ui/nested/pane-dxi.d.ts +23 -23
  491. package/ui/nested/pane-dxi.js +111 -111
  492. package/ui/nested/pane-dxi.js.map +1 -1
  493. package/ui/nested/placeholder-size.d.ts +25 -25
  494. package/ui/nested/placeholder-size.js +100 -100
  495. package/ui/nested/placeholder-size.js.map +1 -1
  496. package/ui/nested/point.d.ts +47 -47
  497. package/ui/nested/point.js +188 -188
  498. package/ui/nested/point.js.map +1 -1
  499. package/ui/nested/popup.d.ts +23 -23
  500. package/ui/nested/popup.js +137 -137
  501. package/ui/nested/popup.js.map +1 -1
  502. package/ui/nested/position.d.ts +20 -20
  503. package/ui/nested/position.js +86 -86
  504. package/ui/nested/position.js.map +1 -1
  505. package/ui/nested/range-container.d.ts +38 -38
  506. package/ui/nested/range-container.js +178 -178
  507. package/ui/nested/range-container.js.map +1 -1
  508. package/ui/nested/range-dxi.d.ts +23 -23
  509. package/ui/nested/range-dxi.js +111 -111
  510. package/ui/nested/range-dxi.js.map +1 -1
  511. package/ui/nested/rangearea.d.ts +20 -20
  512. package/ui/nested/rangearea.js +136 -136
  513. package/ui/nested/rangearea.js.map +1 -1
  514. package/ui/nested/rangebar.d.ts +20 -20
  515. package/ui/nested/rangebar.js +136 -136
  516. package/ui/nested/rangebar.js.map +1 -1
  517. package/ui/nested/reduction.d.ts +22 -22
  518. package/ui/nested/reduction.js +100 -100
  519. package/ui/nested/reduction.js.map +1 -1
  520. package/ui/nested/remote-operations.d.ts +26 -26
  521. package/ui/nested/remote-operations.js +144 -144
  522. package/ui/nested/remote-operations.js.map +1 -1
  523. package/ui/nested/resource-dxi.d.ts +31 -31
  524. package/ui/nested/resource-dxi.js +188 -188
  525. package/ui/nested/resource-dxi.js.map +1 -1
  526. package/ui/nested/route-dxi.d.ts +31 -31
  527. package/ui/nested/route-dxi.js +145 -145
  528. package/ui/nested/route-dxi.js.map +1 -1
  529. package/ui/nested/row-dxi.d.ts +24 -24
  530. package/ui/nested/row-dxi.js +122 -122
  531. package/ui/nested/row-dxi.js.map +1 -1
  532. package/ui/nested/scale.d.ts +114 -114
  533. package/ui/nested/scale.js +519 -519
  534. package/ui/nested/scale.js.map +1 -1
  535. package/ui/nested/scatter.d.ts +20 -20
  536. package/ui/nested/scatter.js +137 -137
  537. package/ui/nested/scatter.js.map +1 -1
  538. package/ui/nested/scroll-bar.d.ts +26 -26
  539. package/ui/nested/scroll-bar.js +144 -144
  540. package/ui/nested/scroll-bar.js.map +1 -1
  541. package/ui/nested/scrolling.d.ts +26 -26
  542. package/ui/nested/scrolling.js +144 -144
  543. package/ui/nested/scrolling.js.map +1 -1
  544. package/ui/nested/search-editor-options.d.ts +20 -20
  545. package/ui/nested/search-editor-options.js +128 -128
  546. package/ui/nested/search-editor-options.js.map +1 -1
  547. package/ui/nested/search-panel.d.ts +27 -27
  548. package/ui/nested/search-panel.js +155 -155
  549. package/ui/nested/search-panel.js.map +1 -1
  550. package/ui/nested/selected-range.d.ts +22 -22
  551. package/ui/nested/selected-range.js +100 -100
  552. package/ui/nested/selected-range.js.map +1 -1
  553. package/ui/nested/selection-style.d.ts +26 -26
  554. package/ui/nested/selection-style.js +144 -144
  555. package/ui/nested/selection-style.js.map +1 -1
  556. package/ui/nested/selection.d.ts +26 -26
  557. package/ui/nested/selection.js +144 -144
  558. package/ui/nested/selection.js.map +1 -1
  559. package/ui/nested/series-dxi.d.ts +20 -20
  560. package/ui/nested/series-dxi.js +122 -122
  561. package/ui/nested/series-dxi.js.map +1 -1
  562. package/ui/nested/series-template.d.ts +22 -22
  563. package/ui/nested/series-template.js +100 -100
  564. package/ui/nested/series-template.js.map +1 -1
  565. package/ui/nested/shadow.d.ts +25 -25
  566. package/ui/nested/shadow.js +133 -133
  567. package/ui/nested/shadow.js.map +1 -1
  568. package/ui/nested/show-event.d.ts +22 -22
  569. package/ui/nested/show-event.js +100 -100
  570. package/ui/nested/show-event.js.map +1 -1
  571. package/ui/nested/show-first-submenu-mode.d.ts +25 -25
  572. package/ui/nested/show-first-submenu-mode.js +100 -100
  573. package/ui/nested/show-first-submenu-mode.js.map +1 -1
  574. package/ui/nested/show-submenu-mode.d.ts +25 -25
  575. package/ui/nested/show-submenu-mode.js +100 -100
  576. package/ui/nested/show-submenu-mode.js.map +1 -1
  577. package/ui/nested/show.d.ts +20 -20
  578. package/ui/nested/show.js +89 -89
  579. package/ui/nested/show.js.map +1 -1
  580. package/ui/nested/shutter.d.ts +22 -22
  581. package/ui/nested/shutter.js +100 -100
  582. package/ui/nested/shutter.js.map +1 -1
  583. package/ui/nested/size.d.ts +22 -22
  584. package/ui/nested/size.js +100 -100
  585. package/ui/nested/size.js.map +1 -1
  586. package/ui/nested/slider-handle.d.ts +23 -23
  587. package/ui/nested/slider-handle.js +111 -111
  588. package/ui/nested/slider-handle.js.map +1 -1
  589. package/ui/nested/slider-marker.d.ts +39 -39
  590. package/ui/nested/slider-marker.js +210 -210
  591. package/ui/nested/slider-marker.js.map +1 -1
  592. package/ui/nested/small-values-grouping.d.ts +24 -24
  593. package/ui/nested/small-values-grouping.js +122 -122
  594. package/ui/nested/small-values-grouping.js.map +1 -1
  595. package/ui/nested/sort-by-group-summary-info-dxi.d.ts +23 -23
  596. package/ui/nested/sort-by-group-summary-info-dxi.js +111 -111
  597. package/ui/nested/sort-by-group-summary-info-dxi.js.map +1 -1
  598. package/ui/nested/sorting.d.ts +24 -24
  599. package/ui/nested/sorting.js +122 -122
  600. package/ui/nested/sorting.js.map +1 -1
  601. package/ui/nested/source.d.ts +22 -22
  602. package/ui/nested/source.js +100 -100
  603. package/ui/nested/source.js.map +1 -1
  604. package/ui/nested/spline.d.ts +20 -20
  605. package/ui/nested/spline.js +136 -136
  606. package/ui/nested/spline.js.map +1 -1
  607. package/ui/nested/splinearea.d.ts +20 -20
  608. package/ui/nested/splinearea.js +136 -136
  609. package/ui/nested/splinearea.js.map +1 -1
  610. package/ui/nested/stackedarea.d.ts +20 -20
  611. package/ui/nested/stackedarea.js +136 -136
  612. package/ui/nested/stackedarea.js.map +1 -1
  613. package/ui/nested/stackedbar.d.ts +20 -20
  614. package/ui/nested/stackedbar.js +137 -137
  615. package/ui/nested/stackedbar.js.map +1 -1
  616. package/ui/nested/stackedline.d.ts +20 -20
  617. package/ui/nested/stackedline.js +136 -136
  618. package/ui/nested/stackedline.js.map +1 -1
  619. package/ui/nested/stackedspline.d.ts +20 -20
  620. package/ui/nested/stackedspline.js +136 -136
  621. package/ui/nested/stackedspline.js.map +1 -1
  622. package/ui/nested/stackedsplinearea.d.ts +20 -20
  623. package/ui/nested/stackedsplinearea.js +136 -136
  624. package/ui/nested/stackedsplinearea.js.map +1 -1
  625. package/ui/nested/state-storing.d.ts +26 -26
  626. package/ui/nested/state-storing.js +144 -144
  627. package/ui/nested/state-storing.js.map +1 -1
  628. package/ui/nested/steparea.d.ts +20 -20
  629. package/ui/nested/steparea.js +136 -136
  630. package/ui/nested/steparea.js.map +1 -1
  631. package/ui/nested/stepline.d.ts +20 -20
  632. package/ui/nested/stepline.js +136 -136
  633. package/ui/nested/stepline.js.map +1 -1
  634. package/ui/nested/stock.d.ts +20 -20
  635. package/ui/nested/stock.js +136 -136
  636. package/ui/nested/stock.js.map +1 -1
  637. package/ui/nested/store.d.ts +21 -21
  638. package/ui/nested/store.js +89 -89
  639. package/ui/nested/store.js.map +1 -1
  640. package/ui/nested/strip-dxi.d.ts +26 -26
  641. package/ui/nested/strip-dxi.js +144 -144
  642. package/ui/nested/strip-dxi.js.map +1 -1
  643. package/ui/nested/strip-style.d.ts +23 -23
  644. package/ui/nested/strip-style.js +111 -111
  645. package/ui/nested/strip-style.js.map +1 -1
  646. package/ui/nested/subtitle.d.ts +23 -23
  647. package/ui/nested/subtitle.js +100 -100
  648. package/ui/nested/subtitle.js.map +1 -1
  649. package/ui/nested/subvalue-indicator.d.ts +20 -20
  650. package/ui/nested/subvalue-indicator.js +98 -98
  651. package/ui/nested/subvalue-indicator.js.map +1 -1
  652. package/ui/nested/summary.d.ts +55 -55
  653. package/ui/nested/summary.js +157 -157
  654. package/ui/nested/summary.js.map +1 -1
  655. package/ui/nested/tab-dxi.d.ts +39 -39
  656. package/ui/nested/tab-dxi.js +211 -211
  657. package/ui/nested/tab-dxi.js.map +1 -1
  658. package/ui/nested/tab-panel-options.d.ts +23 -23
  659. package/ui/nested/tab-panel-options.js +132 -132
  660. package/ui/nested/tab-panel-options.js.map +1 -1
  661. package/ui/nested/text.d.ts +26 -26
  662. package/ui/nested/text.js +133 -133
  663. package/ui/nested/text.js.map +1 -1
  664. package/ui/nested/texts.d.ts +78 -78
  665. package/ui/nested/texts.js +716 -716
  666. package/ui/nested/texts.js.map +1 -1
  667. package/ui/nested/tick-interval.d.ts +29 -29
  668. package/ui/nested/tick-interval.js +177 -177
  669. package/ui/nested/tick-interval.js.map +1 -1
  670. package/ui/nested/tick.d.ts +25 -25
  671. package/ui/nested/tick.js +133 -133
  672. package/ui/nested/tick.js.map +1 -1
  673. package/ui/nested/tile.d.ts +25 -25
  674. package/ui/nested/tile.js +133 -133
  675. package/ui/nested/tile.js.map +1 -1
  676. package/ui/nested/title.d.ts +37 -37
  677. package/ui/nested/title.js +166 -166
  678. package/ui/nested/title.js.map +1 -1
  679. package/ui/nested/toolbar-item-dxi.d.ts +35 -35
  680. package/ui/nested/toolbar-item-dxi.js +188 -188
  681. package/ui/nested/toolbar-item-dxi.js.map +1 -1
  682. package/ui/nested/tooltip.d.ts +46 -46
  683. package/ui/nested/tooltip.js +353 -353
  684. package/ui/nested/tooltip.js.map +1 -1
  685. package/ui/nested/total-item-dxi.d.ts +32 -32
  686. package/ui/nested/total-item-dxi.js +199 -199
  687. package/ui/nested/total-item-dxi.js.map +1 -1
  688. package/ui/nested/url.d.ts +22 -22
  689. package/ui/nested/url.js +100 -100
  690. package/ui/nested/url.js.map +1 -1
  691. package/ui/nested/validation-rule-dxi.d.ts +30 -30
  692. package/ui/nested/validation-rule-dxi.js +188 -188
  693. package/ui/nested/validation-rule-dxi.js.map +1 -1
  694. package/ui/nested/value-axis-dxi.d.ts +125 -125
  695. package/ui/nested/value-axis-dxi.js +587 -587
  696. package/ui/nested/value-axis-dxi.js.map +1 -1
  697. package/ui/nested/value-axis.d.ts +96 -96
  698. package/ui/nested/value-axis.js +454 -454
  699. package/ui/nested/value-axis.js.map +1 -1
  700. package/ui/nested/value-error-bar.d.ts +29 -29
  701. package/ui/nested/value-error-bar.js +177 -177
  702. package/ui/nested/value-error-bar.js.map +1 -1
  703. package/ui/nested/value-format.d.ts +20 -20
  704. package/ui/nested/value-format.js +84 -84
  705. package/ui/nested/value-format.js.map +1 -1
  706. package/ui/nested/value-indicator.d.ts +20 -20
  707. package/ui/nested/value-indicator.js +98 -98
  708. package/ui/nested/value-indicator.js.map +1 -1
  709. package/ui/nested/vertical-line.d.ts +26 -26
  710. package/ui/nested/vertical-line.js +144 -144
  711. package/ui/nested/vertical-line.js.map +1 -1
  712. package/ui/nested/view-dxi.d.ts +38 -38
  713. package/ui/nested/view-dxi.js +276 -276
  714. package/ui/nested/view-dxi.js.map +1 -1
  715. package/ui/nested/width.d.ts +26 -26
  716. package/ui/nested/width.js +144 -144
  717. package/ui/nested/width.js.map +1 -1
  718. package/ui/number-box.d.ts +362 -362
  719. package/ui/number-box.js +683 -683
  720. package/ui/number-box.js.map +1 -1
  721. package/ui/panorama.d.ts +231 -231
  722. package/ui/panorama.js +449 -449
  723. package/ui/panorama.js.map +1 -1
  724. package/ui/pie-chart.d.ts +381 -381
  725. package/ui/pie-chart.js +722 -722
  726. package/ui/pie-chart.js.map +1 -1
  727. package/ui/pivot-grid-field-chooser.d.ts +201 -201
  728. package/ui/pivot-grid-field-chooser.js +427 -427
  729. package/ui/pivot-grid-field-chooser.js.map +1 -1
  730. package/ui/pivot-grid.d.ts +333 -333
  731. package/ui/pivot-grid.js +691 -691
  732. package/ui/pivot-grid.js.map +1 -1
  733. package/ui/pivot.d.ts +233 -233
  734. package/ui/pivot.js +446 -446
  735. package/ui/pivot.js.map +1 -1
  736. package/ui/polar-chart.d.ts +421 -421
  737. package/ui/polar-chart.js +841 -841
  738. package/ui/polar-chart.js.map +1 -1
  739. package/ui/popover.d.ts +339 -339
  740. package/ui/popover.js +655 -655
  741. package/ui/popover.js.map +1 -1
  742. package/ui/popup.d.ts +363 -363
  743. package/ui/popup.js +703 -703
  744. package/ui/popup.js.map +1 -1
  745. package/ui/progress-bar.d.ts +201 -201
  746. package/ui/progress-bar.js +420 -420
  747. package/ui/progress-bar.js.map +1 -1
  748. package/ui/radio-group.d.ts +275 -275
  749. package/ui/radio-group.js +575 -575
  750. package/ui/radio-group.js.map +1 -1
  751. package/ui/range-selector.d.ts +312 -312
  752. package/ui/range-selector.js +778 -778
  753. package/ui/range-selector.js.map +1 -1
  754. package/ui/range-slider.d.ts +292 -292
  755. package/ui/range-slider.js +631 -631
  756. package/ui/range-slider.js.map +1 -1
  757. package/ui/resizable.d.ts +125 -125
  758. package/ui/resizable.js +251 -251
  759. package/ui/resizable.js.map +1 -1
  760. package/ui/responsive-box.d.ts +241 -241
  761. package/ui/responsive-box.js +433 -433
  762. package/ui/responsive-box.js.map +1 -1
  763. package/ui/scheduler.d.ts +589 -589
  764. package/ui/scheduler.js +1024 -1024
  765. package/ui/scheduler.js.map +1 -1
  766. package/ui/scroll-view.d.ts +177 -177
  767. package/ui/scroll-view.js +349 -349
  768. package/ui/scroll-view.js.map +1 -1
  769. package/ui/select-box.d.ts +547 -547
  770. package/ui/select-box.js +1025 -1025
  771. package/ui/select-box.js.map +1 -1
  772. package/ui/slide-out-view.d.ts +153 -153
  773. package/ui/slide-out-view.js +325 -325
  774. package/ui/slide-out-view.js.map +1 -1
  775. package/ui/slide-out.d.ts +281 -281
  776. package/ui/slide-out.js +530 -530
  777. package/ui/slide-out.js.map +1 -1
  778. package/ui/slider.d.ts +261 -261
  779. package/ui/slider.js +555 -555
  780. package/ui/slider.js.map +1 -1
  781. package/ui/sparkline.d.ts +309 -309
  782. package/ui/sparkline.js +629 -629
  783. package/ui/sparkline.js.map +1 -1
  784. package/ui/switch.d.ts +221 -221
  785. package/ui/switch.js +466 -466
  786. package/ui/switch.js.map +1 -1
  787. package/ui/tab-panel.d.ts +323 -323
  788. package/ui/tab-panel.js +596 -596
  789. package/ui/tab-panel.js.map +1 -1
  790. package/ui/tabs.d.ts +285 -285
  791. package/ui/tabs.js +546 -546
  792. package/ui/tabs.js.map +1 -1
  793. package/ui/tag-box.d.ts +575 -575
  794. package/ui/tag-box.js +1091 -1091
  795. package/ui/tag-box.js.map +1 -1
  796. package/ui/text-area.d.ts +329 -329
  797. package/ui/text-area.js +616 -616
  798. package/ui/text-area.js.map +1 -1
  799. package/ui/text-box.d.ts +369 -369
  800. package/ui/text-box.js +696 -696
  801. package/ui/text-box.js.map +1 -1
  802. package/ui/tile-view.d.ts +263 -263
  803. package/ui/tile-view.js +508 -508
  804. package/ui/tile-view.js.map +1 -1
  805. package/ui/toast.d.ts +278 -278
  806. package/ui/toast.js +570 -570
  807. package/ui/toast.js.map +1 -1
  808. package/ui/toolbar.d.ts +215 -215
  809. package/ui/toolbar.js +396 -396
  810. package/ui/toolbar.js.map +1 -1
  811. package/ui/tooltip.d.ts +273 -273
  812. package/ui/tooltip.js +556 -556
  813. package/ui/tooltip.js.map +1 -1
  814. package/ui/tree-list.d.ts +603 -603
  815. package/ui/tree-list.js +1172 -1172
  816. package/ui/tree-list.js.map +1 -1
  817. package/ui/tree-map.d.ts +341 -341
  818. package/ui/tree-map.js +635 -635
  819. package/ui/tree-map.js.map +1 -1
  820. package/ui/tree-view.d.ts +463 -463
  821. package/ui/tree-view.js +909 -909
  822. package/ui/tree-view.js.map +1 -1
  823. package/ui/validation-group.d.ts +65 -65
  824. package/ui/validation-group.js +149 -149
  825. package/ui/validation-group.js.map +1 -1
  826. package/ui/validation-summary.d.ts +110 -110
  827. package/ui/validation-summary.js +228 -228
  828. package/ui/validation-summary.js.map +1 -1
  829. package/ui/validator.d.ts +111 -111
  830. package/ui/validator.js +261 -261
  831. package/ui/validator.js.map +1 -1
  832. package/ui/vector-map.d.ts +521 -521
  833. package/ui/vector-map.js +695 -695
  834. package/ui/vector-map.js.map +1 -1
package/README.md CHANGED
@@ -1,603 +1,603 @@
1
- [![CircleCI](https://img.shields.io/circleci/project/github/DevExpress/devextreme-angular/17.2.svg)](https://circleci.com/gh/DevExpress/devextreme-angular) [![npm version](https://badge.fury.io/js/devextreme-angular.svg)](https://badge.fury.io/js/devextreme-angular)
2
-
3
- ### If you are looking for the 17.1 branch, please forward the following [link](https://github.com/DevExpress/devextreme-angular/tree/17.1).
4
-
5
- # Angular UI and Visualization Components Based on DevExtreme Widgets #
6
-
7
- This project allows you to use [DevExtreme Widgets](http://js.devexpress.com/Demos/WidgetsGallery/) in [Angular](https://angular.io/) applications.
8
-
9
- * [Getting started](#getting-started)
10
- * [Prerequisites](#prerequisites)
11
- * [DevExtreme installation](#add-to-existing-app)
12
- * [Starting a new application](#create-application)
13
- * [Running the local examples](#running-examples)
14
- * [Include jQuery integration](#jquery-integration)
15
- * [Usage samples](#usage-samples)
16
- * [Static string option value](#static-option)
17
- * [Static non-string option value](#static-non-string-option)
18
- * [Event handling](#event-handling)
19
- * [Callback functions](#callback-functions)
20
- * [One-way option binding](#one-way-binding)
21
- * [Two-way option binding](#two-way-binding)
22
- * [Custom templates](#custom-templates)
23
- * [Data layer](#data-layer)
24
- * [DevExtreme utils](#devextreme-utils)
25
- * [Components with transcluded content](#components-with-transcluded-content)
26
- * [Angular forms](#angular-forms)
27
- * [Using DevExtreme validation features](#devextreme-validation-features)
28
- * [Configuration components](#configuration-components)
29
- * [Accessing a DevExtreme widget instance](#accessing-widget-instance)
30
- * [Angular change detection](#angular-change-detection)
31
- * [Demos](#demos)
32
- * [API reference](#api-reference)
33
- * [Bundle size optimization](#bundle-optimization)
34
- * [Server-side rendering](#server-side-rendering)
35
- * [License](#license)
36
- * [Support & feedback](#support-feedback)
37
-
38
- ## <a name="getting-started"></a>Getting Started ##
39
-
40
- You have the following options to start:
41
-
42
- * [Play around with our Plunker](http://plnkr.co/edit/XuAPDd?p=preview) without installing anything
43
- * [Add DevExtreme to your existing Angular application](#add-to-existing-app)
44
- * [Creating a new Angular application](#create-application) and install DevExtreme
45
- * [Run the local examples](#running-examples)
46
-
47
- ### <a name="prerequisites"></a>Prerequisites ###
48
-
49
- <a href="https://docs.npmjs.com/getting-started/installing-node" target="_blank" title="Installing Node.js and updating npm">Node.js and npm</a> are
50
- required and essential to Angular development.
51
-
52
- <a href="https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md" target="_blank" title="Installing Gulp">Gulp</a> is
53
- required to build the project and run tests.
54
-
55
- ### <a name="add-to-existing-app"></a>Adding DevExteme to an Existing Angular Application ###
56
-
57
- #### <a name="installation"></a>Install DevExtreme ####
58
-
59
- Install the **devextreme** and **devextreme-angular** npm packages:
60
-
61
- ```bash
62
- npm install --save devextreme devextreme-angular
63
- ```
64
-
65
- #### <a name="additional-configuration"></a>Additional Configuration ####
66
-
67
- The further configuration steps depend on which build tool, bundler or module loader you are using. Please choose the one you need:
68
-
69
- * [Configuring SystemJS](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-systemjs.md#configuration)
70
- * [Configuring Angular CLI](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-angular-cli.md#configuration)
71
- * [Configuring Webpack](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-webpack.md#configuration)
72
- * [Configuring Rollup](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-rollup.md#configuration)
73
- * [Configuring Ionic 2](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-ionic2.md#configuration)
74
-
75
- #### <a name="import-modules"></a>Import DevExtreme Modules ####
76
-
77
- Go to your main .ts file (usually *src/app.module.ts*) and import the required modules to your app:
78
-
79
- ```js
80
- ...
81
- import { DxButtonModule } from 'devextreme-angular';
82
-
83
- @NgModule({
84
- ...
85
- imports: [
86
- ...
87
- DxButtonModule,
88
- ...
89
- ]
90
- })
91
- export class AppModule {}
92
- ```
93
-
94
- Note, you can import the **DevExtremeModule** module to include all the DevExtreme components at once, but it might affect the final bundle size and startup time.
95
- Check the [bundle optimization](#bundle-optimization) section for more info.
96
-
97
- #### Use DevExtreme Components ####
98
-
99
- Now you can use a DevExteme component in your application:
100
-
101
- ```js
102
- @Component({
103
- selector: 'my-app',
104
- template: '<dx-button text="Press me" (onClick)="helloWorld()"></dx-button>'
105
- })
106
- export class AppComponent {
107
- helloWorld() {
108
- alert('Hello world!');
109
- }
110
- }
111
- ```
112
-
113
- ### <a name="create-application"></a>Create a new Angular Application ###
114
-
115
- Depending on your requirements you can choose one of the following ways to start:
116
-
117
- * [Start with SystemJS](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-systemjs.md)
118
- * [Start with Angular CLI](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-angular-cli.md)
119
- * [Start with Webpack](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-webpack.md)
120
- * [Start with Rollup](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-rollup.md)
121
- * [Start with Ionic 2](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-ionic2.md)
122
-
123
- ### <a name="running-examples"></a>Running the Local Examples ###
124
-
125
- ```bash
126
- # clone our repo
127
- # --depth 1 removes all but one .git commit history
128
- git clone --depth 1 https://github.com/DevExpress/devextreme-angular.git
129
-
130
- # change directory to our repo
131
- cd devextreme-angular
132
-
133
- # install the repo with npm
134
- npm install
135
-
136
- # start the web-server
137
- npm start
138
-
139
- ```
140
-
141
- Navigate to [http://127.0.0.1:8875/examples/](http://127.0.0.1:8875/examples/) in the opened browser window. Explore the **examples** folder of this repository for the examples source code.
142
-
143
- ### <a name="jquery-integration"></a>Include jQuery integration ###
144
- Starting with version 17.2, DevExtreme doesn't depend on jQuery. It means that our widgets work without jQuery elements. If you need to use jQuery, you can manually install the jquery npm package and include the jQuery integration as described below:
145
-
146
- ```js
147
- npm install --save jquery
148
- ```
149
-
150
- ```js
151
- import 'devextreme/integration/jquery';
152
- ```
153
-
154
- ## <a name="usage-samples"></a>Usage Samples ##
155
-
156
- ### <a name="static-option"></a>Static String Option Value ###
157
-
158
- To specify a string widget's option statically
159
- (the [text](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxButton/Configuration/#text)
160
- option of dxButton):
161
-
162
- ```html
163
- <dx-button text="Simple button"></dx-button>
164
- ```
165
-
166
- ### <a name="static-non-string-option"></a>Static Non-string Option Value ###
167
-
168
- To specify a non-string widget's option statically
169
- (the [disabled](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxButton/Configuration/#disabled)
170
- option of dxButton):
171
-
172
- ```html
173
- <dx-button [disabled]="false"></dx-button>
174
- ```
175
-
176
- ### <a name="event-handling"></a>Event Handling ###
177
-
178
- To bind the dxButton’s [click](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxButton/Events/#click) event:
179
-
180
- ```html
181
- <dx-button (onClick)="handler()"></dx-button>
182
- ```
183
-
184
- ### <a name="callback-functions"></a>Callback Functions ###
185
-
186
- To specify a widget's option using a callback function (the [layer.customize](https://js.devexpress.com/Documentation/ApiReference/Data_Visualization_Widgets/dxVectorMap/Configuration/layers/#customize)
187
- option of dxVectorMap):
188
-
189
- ```html
190
- <dx-vector-map>
191
- ...
192
- <dxi-layer
193
- ...
194
- [customize]="customizeLayers">
195
- </dxi-layer>
196
- </dx-vector-map>
197
- ```
198
-
199
- Note that callback functions are executed _outside_ the context of the component, but if the context is important, you can explicitly bind it to the callback function in the constructor.
200
-
201
- ```js
202
- constructor() {
203
- this.customizeLayers = this.customizeLayers.bind(this);
204
- }
205
-
206
- customizeLayers(elements) {
207
- let country = this.myCountry;
208
- ...
209
- }
210
- ```
211
-
212
- ### <a name="one-way-binding"></a>One-way Option Binding ###
213
-
214
- If we want changes to the value of ‘bindingProperty’ of the host component to propagate to the
215
- [value](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxTextBox/Configuration/#value) of the dxTextBox widget,
216
- a one-way binding approach is used:
217
-
218
- ```html
219
- <dx-text-box [value]="bindingProperty"></dx-text-box>
220
- ```
221
-
222
- ### <a name="two-way-binding"></a>Two-way Option Binding ###
223
-
224
- In addition to the one-way binding, we can also perform two-way binding, which propagates changes from the bindingProperty to the widget
225
- or vice versa from the widget to the bindingProperty:
226
-
227
- ```html
228
- <dx-text-box [(value)]="bindingProperty"></dx-text-box>
229
- ```
230
-
231
- ### <a name="custom-templates"></a>Custom Templates ###
232
-
233
- In case you want to customize the rendering of a DevExtreme widget, we support custom templates. For instance, we can specify
234
- the [itemTemplate](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxList/Configuration/#itemTemplate)
235
- and [groupTemplate](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxList/Configuration/#groupTemplate)
236
- of the dxList widget as follows:
237
-
238
- ```html
239
- <dx-list [grouped]="true" [items]="grouppedItems">
240
- <div *dxTemplate="let itemData of 'item'; let itemIndex = index">
241
- {{itemIndex}} - {{itemData.someProperty}}
242
- </div>
243
- <div *dxTemplate="let groupData of 'group'">
244
- {{groupData.someProperty}}
245
- </div>
246
- </dx-list>
247
- ```
248
- The local 'itemData' and 'groupData' variables (that are declared via the 'let' keyword) expose the corresponding item data object. You can use it to
249
- render the data where you need inside the template.
250
-
251
- The 'item' and 'group' names are default template names for the 'itemTemplate' and 'groupTemplate' options of the dxList widget.
252
-
253
- ### <a name="data-layer"></a>Data Layer ###
254
-
255
- The DevExtreme framework includes a data layer, which is a set of complementary components that enable you to read and write data.
256
- For more details please refer to [the documentation on the official website](https://js.devexpress.com/Documentation/Guide/Data_Layer/Data_Layer/).
257
-
258
- ### <a name="devextreme-utils"></a>DevExtreme Utils ###
259
-
260
- The DevExtreme provides utils that can be used in different application parts such as widgets and data. For more details please refer to [the documentation on the official website](https://js.devexpress.com/Documentation/ApiReference/Common/utils/).
261
-
262
- ### <a name="components-with-transcluded-content"></a>Components with Transcluded Content ###
263
-
264
- In addition to using dxTemplate, it is possible to put the content of the following widgets directly into the markup:
265
- [dxResizable](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxResizable/),
266
- [dxScrollView](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxScrollView/),
267
- [dxValidationGroup](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxValidationGroup/).
268
- For instance, we can set the content for
269
- the [dxScrollView](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxScrollView/) widget as shown below:
270
-
271
- ```html
272
- <dx-scroll-view>
273
- <div>Some scrollable content</div>
274
- </dx-scroll-view>
275
- ```
276
-
277
- ### <a name="angular-forms"></a>Angular Forms ###
278
-
279
- The DevExtreme Angular editors support the 'ngModel' binding as well as the 'formControlName' directive, which are necessary for the
280
- [Angular forms](https://angular.io/docs/ts/latest/guide/forms.html) features.
281
-
282
- ```html
283
- <form [formGroup]="form">
284
- <dx-text-box
285
- name="email"
286
- [(ngModel)]="email"
287
- [isValid]="emailControl.valid || emailControl.pristine"
288
- [validationError]="{ message: 'Email is invalid'}">
289
- </dx-text-box>
290
- </form>
291
- ```
292
-
293
-
294
- ```js
295
- @Component({
296
- selector: 'my-app',
297
- templateUrl: 'app/app.component.html'
298
- })
299
- export class AppComponent implements OnInit {
300
- email: string;
301
- emailControl: AbstractControl;
302
- form: FormGroup;
303
- ngOnInit() {
304
- this.form = new FormGroup({
305
- email: new FormControl('', Validators.compose([Validators.required, CustomValidator.mailFormat]))
306
- });
307
- this.emailControl = this.form.controls['email'];
308
- }
309
- }
310
- ```
311
-
312
- ### <a name="devextreme-validation-features"></a>Using DevExtreme Validation Features ###
313
-
314
- You can use the [built-in validators](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxValidator/Validation_Rules/),
315
- validation summary and other DevExtreme validation features with Angular DevExtreme editors.
316
-
317
-
318
- ```html
319
- <dx-validation-group>
320
-
321
- <dx-text-box [(value)]="email">
322
- <dx-validator [validationRules]="validationRules.email"></dx-validator>
323
- </dx-text-box>
324
- <dx-text-box [(value)]="password" mode="password">
325
- <dx-validator [validationRules]="validationRules.password"></dx-validator>
326
- </dx-text-box>
327
-
328
- <dx-validation-summary></dx-validation-summary>
329
-
330
- <dx-button (onClick)="validate($event)" text="Submit"></dx-button>
331
-
332
- </dx-validation-group>
333
- ```
334
-
335
-
336
- ```js
337
- @Component({
338
- selector: 'my-app',
339
- templateUrl: 'app/app.component.html'
340
- })
341
- export class AppComponent {
342
- email: string;
343
- password: string;
344
- validationRules = {
345
- email: [
346
- { type: 'required', message: 'Email is required.' },
347
- { type: 'email', message: 'Email is invalid.' }
348
- ],
349
- password: [
350
- { type: 'required', message: 'Email is required.' }
351
- ]
352
- };
353
- validate(params) {
354
- let result = params.validationGroup.validate();
355
- if (result.isValid) {
356
- // form data is valid
357
- // params.validationGroup.reset();
358
- }
359
- }
360
- }
361
- ```
362
-
363
-
364
- ### <a name="configuration-components"></a>Configuration Components ###
365
-
366
- You can use `dxo-` ('o' is a contraction of 'option') prefixed components to configure complex nested options for widgets.
367
- The following example demonstrates how to configure the [tooltip](https://js.devexpress.com/Documentation/ApiReference/Data_Visualization_Widgets/dxTreeMap/Configuration/tooltip/) option of the dxTreeMap widget:
368
-
369
- ```html
370
- <dx-tree-map [dataSource]="treeData">
371
- <dxo-tooltip [enabled]="showTooltip" format="thousands"></dxo-tooltip>
372
- </dx-tree-map>
373
-
374
- <dx-button text="Toggle tooltip" (onClick)="toggleTooltip()"></dx-button>
375
- ```
376
-
377
- ```js
378
- @Component({
379
- selector: 'my-app',
380
- templateUrl: 'app/app.component.html'
381
- })
382
- export class AppComponent {
383
- treeData = ...;
384
- showTooltip = false;
385
- toggleTooltip() {
386
- this.showTooltip = !this.showTooltip;
387
- }
388
- }
389
- ```
390
-
391
- You can also use `dxi-` ('i' is a contraction of 'item') prefixed components to configure complex collection options for widgets.
392
- The following example demonstrates how to configure the [columns](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid/Configuration/columns/) option of the dxDataGrid widget:
393
-
394
- ```html
395
- <dx-data-grid [dataSource]="data">
396
- <dxi-column dataField="firstName" caption="First Name"></dxi-column>
397
- <dxi-column dataField="lastName" caption="Last Name" [visible]="showLastName"></dxi-column>
398
- </dx-data-grid>
399
-
400
- <dx-button text="Toggle the 'Last Name' column" (onClick)="toggleLastName()"></dx-button>
401
- ```
402
-
403
- ```js
404
- @Component({
405
- selector: 'my-app',
406
- templateUrl: 'app/app.component.html'
407
- })
408
- export class AppComponent {
409
- data = ...;
410
- showLastName = false;
411
- toggleLastName() {
412
- this.showLastName = !this.showLastName;
413
- }
414
- }
415
- ```
416
-
417
- To configure options that can accept a configuration object or an array of configuration objects, use `dxi-` prefixed components.
418
- The following example demonstrates how to configure the [valueAxis](https://js.devexpress.com/Documentation/ApiReference/Data_Visualization_Widgets/dxChart/Configuration/valueAxis/) option of the dxChart widget:
419
-
420
- ```html
421
- <dx-chart [dataSource]="data">
422
- <dxi-series valueField="value" argumentField="argument"></dxi-series>
423
- <dxi-value-axis>
424
- <dxo-label format="millions"></dxo-label>
425
- </dxi-value-axis>
426
- </dx-chart>
427
- ```
428
-
429
- ```js
430
- @Component({
431
- selector: 'my-app',
432
- templateUrl: 'app/app.component.html'
433
- })
434
- export class AppComponent {
435
- data = ...;
436
- }
437
- ```
438
-
439
- It is possible to specify an item template inside the `dxi-` prefixed components and use Angular
440
- [structural directives](https://angular.io/docs/ts/latest/guide/structural-directives.html) such as ngFor. Note that
441
- the available item properties are described in the [Default Item Template](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxList/Default_Item_Template/)
442
- section of a corresponding widget documentation reference.
443
-
444
- ```html
445
- <dx-list>
446
- <dxi-item>
447
- <h1>Items available</h1>
448
- </dxi-item>
449
- <dxi-item *ngFor="let item of listItems" [badge]="item.badge">
450
- <h2>{{item.text}}</h2>
451
- </dxi-item>
452
- </dx-list>
453
- ```
454
-
455
- ```js
456
- @Component({
457
- selector: 'my-app',
458
- templateUrl: 'app/app.component.html'
459
- })
460
- export class AppComponent {
461
- listItems = [
462
- {
463
- text: 'Cars',
464
- badge: '12'
465
- },
466
- {
467
- text: 'Bikes',
468
- badge: '5'
469
- }
470
- ];
471
- }
472
- ```
473
-
474
- If your item template contains some *nested* components, declare it using the parameterless `dxTemplate` structural directive as follows:
475
-
476
- ```html
477
- <dx-list>
478
- <dxi-item>
479
- <div *dxTemplate>
480
- <dx-button text="I'm a nested child component"></dx-button>
481
- </div>
482
- </dxi-item>
483
- </dx-list>
484
- ```
485
-
486
- Angular has a built-in `template` directive. To define the `template` property of the configuration component (for example, `dxo-master-detail`), use the following code:
487
- ```html
488
- <dxo-master-detail [template]="'masterDetail'"></dxo-master-detail>
489
- ```
490
-
491
- Note that some options with an object type are not implemented as nested components - for example,
492
- [editorOptions of dxDataGrid](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid/Configuration/columns/#editorOptions), [editorOptions of dxForm](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxForm/Item_Types/SimpleItem/#editorOptions), [the widget option of dxToolbar](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxToolbar/Default_Item_Template/#options).
493
-
494
- ### <a name="accessing-widget-instance"></a>Accessing a DevExtreme Widget Instance ###
495
-
496
- You can access a DevExtreme widget instance using the `@ViewChild` or `@ViewChildren` decorator (depending on whether you are getting just one or several instances of one widget) and the component's
497
- 'instance' property. Both decorators accept a component name or a [template reference variable](https://angular.io/guide/template-syntax#template-reference-variables--var-). In the example below, the
498
- [refresh](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid/Methods/#refresh)
499
- method of the dxDataGrid is called:
500
-
501
- ```js
502
- import { Component, ViewChild } from '@angular/core';
503
- import { DxDataGridComponent } from "devextreme-angular";
504
-
505
- @Component({
506
- selector: 'my-app',
507
- template: `
508
- <dx-data-grid #targetDataGrid [dataSource]="dataSource"></dx-data-grid>
509
- <dx-button text="Refresh data" (onClick)="refresh()"></dx-button>
510
- `
511
- })
512
- export class AppComponent implements OnChanges {
513
- @ViewChild(DxDataGridComponent) dataGrid:DxDataGridComponent
514
- // or
515
- // @ViewChild("targetDataGrid") dataGrid: DxDataGridComponent
516
- refresh() {
517
- this.dataGrid.instance.refresh();
518
- }
519
- }
520
- ```
521
-
522
- To access a DevExtreme widget instance in markup, you can use the same template reference variables. The following example demonstrates how you can get a dxSelectBox value in the template.
523
-
524
- ```html
525
- <dx-select-box #selectbox [items]="items"></dx-select-box>
526
- {{selectbox.value}}
527
- ```
528
-
529
- ### <a name="angular-change-detection"></a>Angular Change Detection ###
530
-
531
- By default, in Angular, options changes are checked on each user action.
532
- If you bind a widget option to this function, it should return a static object.
533
- Otherwise, Angular considers that the option is constantly changed after each user action.
534
- Alternatively, you can change the default behavior and set the [ChangeDetectionStrategy](https://angular.io/docs/ts/latest/api/core/index/ChangeDetectionStrategy-enum.html) component option to "OnPush".
535
-
536
- ```js
537
- import {Component, ChangeDetectionStrategy} from '@angular/core';
538
-
539
- @Component({
540
- selector: 'my-app',
541
- ....
542
- changeDetection: ChangeDetectionStrategy.OnPush
543
- })
544
- ```
545
-
546
- ## <a name="demos"></a>Demos ##
547
-
548
- * [GolfClub real-world application](https://devexpress.github.io/golfclub/) ([sources](https://github.com/DevExpress/golfclub))
549
- * [Lots of feature-based examples](https://js.devexpress.com/Demos/WidgetsGallery/Demo/Data_Grid/LocalDataSource/Angular/Light/)
550
-
551
- ## <a name="api-reference"></a>API Reference ##
552
-
553
- DevExtreme Angular components mirror
554
- [DevExtreme JavaScript API](http://js.devexpress.com/Documentation/ApiReference/) but use
555
- [Angular syntax](#usage-samples) for specifying widget options, subscribing to events and custom templates declaration.
556
-
557
- ## <a name="bundle-optimization"></a>Bundle Size Optimization ##
558
-
559
- ### Bundlers with Tree Shaking Support ###
560
-
561
- *Tree shaking* can greatly reduce the downloaded size of the application by removing unused portions of both source and library code. There are a number of
562
- bundlers with tree shaking support, such as Webpack 2, Rollup, SystemJS Bundler, etc. Due to specifics of the tree shaking algorithm, your project typescript sources should
563
- be prepared accordingly to make tree shaking available. This preparations are [performed by the Angular Compiler](https://angular.io/docs/ts/latest/cookbook/aot-compiler.html#!#tree-shaking).
564
- You can follow one of the existing guides to configure tree shaking with your bundler ([Webpack 2](http://blog.rangle.io/optimize-your-angular2-application-with-tree-shaking/),
565
- [Angular CLI](https://github.com/angular/angular-cli#bundling),
566
- [Rollup](https://angular.io/docs/ts/latest/cookbook/aot-compiler.html#!#tree-shaking)).
567
-
568
- To make it work with DevExtreme Angular package, you just need to import only the modules required in your application, not the whole DevExtremeModule. For instance,
569
- you can import only DxButtonModule as follows:
570
-
571
- ```js
572
- import { DxButtonModule } from 'devextreme-angular';
573
- ```
574
-
575
- Note, AOT Compilation also decreases a bundle size by precompiling your HTML templates. So, the markup and the template compiler are not included into the final bundle.
576
-
577
- ### Bundlers without Tree Shaking Support ###
578
-
579
- If you are not going to configure tree shaking, you can optimize your bundle size by using imports from specific modules, not from the main 'devextreme-angular' module. You can do this
580
- as follows:
581
-
582
- ```js
583
- import { DxButtonModule } from 'devextreme-angular/ui/button';
584
- ```
585
-
586
- ## <a name="server-side-rendering"></a>Server-side Rendering ##
587
-
588
- Currently, DevExtreme components **do not support** server side rendering (check [this issue](https://github.com/DevExpress/devextreme-angular/issues/46)).
589
- So, you are required to switch this feature off.
590
-
591
- ## <a name="license"></a>License ##
592
-
593
- Familiarize yourself with the
594
- [DevExtreme License](https://js.devexpress.com/Licensing/).
595
- [Free trial is available!](http://js.devexpress.com/Buy/)
596
-
597
- **DevExtreme Angular components are released as a MIT-licensed (free and open-source) add-on to DevExtreme.**
598
-
599
- ## <a name="support-feedback"></a>Support & Feedback ##
600
-
601
- * For general Angular topics, follow [these guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md)
602
- * For questions regarding DevExtreme libraries and JavaScript API, use [DevExpress Support Center](https://www.devexpress.com/Support/Center)
603
- * For DevExtreme Angular integration bugs, questions and suggestions, use the [GitHub issue tracker](https://github.com/DevExpress/devextreme-angular/issues)
1
+ [![CircleCI](https://img.shields.io/circleci/project/github/DevExpress/devextreme-angular/17.2.svg)](https://circleci.com/gh/DevExpress/devextreme-angular) [![npm version](https://badge.fury.io/js/devextreme-angular.svg)](https://badge.fury.io/js/devextreme-angular)
2
+
3
+ ### If you are looking for the 17.1 branch, please forward the following [link](https://github.com/DevExpress/devextreme-angular/tree/17.1).
4
+
5
+ # Angular UI and Visualization Components Based on DevExtreme Widgets #
6
+
7
+ This project allows you to use [DevExtreme Widgets](http://js.devexpress.com/Demos/WidgetsGallery/) in [Angular](https://angular.io/) applications.
8
+
9
+ * [Getting started](#getting-started)
10
+ * [Prerequisites](#prerequisites)
11
+ * [DevExtreme installation](#add-to-existing-app)
12
+ * [Starting a new application](#create-application)
13
+ * [Running the local examples](#running-examples)
14
+ * [Include jQuery integration](#jquery-integration)
15
+ * [Usage samples](#usage-samples)
16
+ * [Static string option value](#static-option)
17
+ * [Static non-string option value](#static-non-string-option)
18
+ * [Event handling](#event-handling)
19
+ * [Callback functions](#callback-functions)
20
+ * [One-way option binding](#one-way-binding)
21
+ * [Two-way option binding](#two-way-binding)
22
+ * [Custom templates](#custom-templates)
23
+ * [Data layer](#data-layer)
24
+ * [DevExtreme utils](#devextreme-utils)
25
+ * [Components with transcluded content](#components-with-transcluded-content)
26
+ * [Angular forms](#angular-forms)
27
+ * [Using DevExtreme validation features](#devextreme-validation-features)
28
+ * [Configuration components](#configuration-components)
29
+ * [Accessing a DevExtreme widget instance](#accessing-widget-instance)
30
+ * [Angular change detection](#angular-change-detection)
31
+ * [Demos](#demos)
32
+ * [API reference](#api-reference)
33
+ * [Bundle size optimization](#bundle-optimization)
34
+ * [Server-side rendering](#server-side-rendering)
35
+ * [License](#license)
36
+ * [Support & feedback](#support-feedback)
37
+
38
+ ## <a name="getting-started"></a>Getting Started ##
39
+
40
+ You have the following options to start:
41
+
42
+ * [Play around with our Plunker](http://plnkr.co/edit/XuAPDd?p=preview) without installing anything
43
+ * [Add DevExtreme to your existing Angular application](#add-to-existing-app)
44
+ * [Creating a new Angular application](#create-application) and install DevExtreme
45
+ * [Run the local examples](#running-examples)
46
+
47
+ ### <a name="prerequisites"></a>Prerequisites ###
48
+
49
+ <a href="https://docs.npmjs.com/getting-started/installing-node" target="_blank" title="Installing Node.js and updating npm">Node.js and npm</a> are
50
+ required and essential to Angular development.
51
+
52
+ <a href="https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md" target="_blank" title="Installing Gulp">Gulp</a> is
53
+ required to build the project and run tests.
54
+
55
+ ### <a name="add-to-existing-app"></a>Adding DevExteme to an Existing Angular Application ###
56
+
57
+ #### <a name="installation"></a>Install DevExtreme ####
58
+
59
+ Install the **devextreme** and **devextreme-angular** npm packages:
60
+
61
+ ```bash
62
+ npm install --save devextreme devextreme-angular
63
+ ```
64
+
65
+ #### <a name="additional-configuration"></a>Additional Configuration ####
66
+
67
+ The further configuration steps depend on which build tool, bundler or module loader you are using. Please choose the one you need:
68
+
69
+ * [Configuring SystemJS](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-systemjs.md#configuration)
70
+ * [Configuring Angular CLI](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-angular-cli.md#configuration)
71
+ * [Configuring Webpack](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-webpack.md#configuration)
72
+ * [Configuring Rollup](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-rollup.md#configuration)
73
+ * [Configuring Ionic 2](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-ionic2.md#configuration)
74
+
75
+ #### <a name="import-modules"></a>Import DevExtreme Modules ####
76
+
77
+ Go to your main .ts file (usually *src/app.module.ts*) and import the required modules to your app:
78
+
79
+ ```js
80
+ ...
81
+ import { DxButtonModule } from 'devextreme-angular';
82
+
83
+ @NgModule({
84
+ ...
85
+ imports: [
86
+ ...
87
+ DxButtonModule,
88
+ ...
89
+ ]
90
+ })
91
+ export class AppModule {}
92
+ ```
93
+
94
+ Note, you can import the **DevExtremeModule** module to include all the DevExtreme components at once, but it might affect the final bundle size and startup time.
95
+ Check the [bundle optimization](#bundle-optimization) section for more info.
96
+
97
+ #### Use DevExtreme Components ####
98
+
99
+ Now you can use a DevExteme component in your application:
100
+
101
+ ```js
102
+ @Component({
103
+ selector: 'my-app',
104
+ template: '<dx-button text="Press me" (onClick)="helloWorld()"></dx-button>'
105
+ })
106
+ export class AppComponent {
107
+ helloWorld() {
108
+ alert('Hello world!');
109
+ }
110
+ }
111
+ ```
112
+
113
+ ### <a name="create-application"></a>Create a new Angular Application ###
114
+
115
+ Depending on your requirements you can choose one of the following ways to start:
116
+
117
+ * [Start with SystemJS](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-systemjs.md)
118
+ * [Start with Angular CLI](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-angular-cli.md)
119
+ * [Start with Webpack](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-webpack.md)
120
+ * [Start with Rollup](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-rollup.md)
121
+ * [Start with Ionic 2](https://github.com/DevExpress/devextreme-angular/blob/master/docs/using-ionic2.md)
122
+
123
+ ### <a name="running-examples"></a>Running the Local Examples ###
124
+
125
+ ```bash
126
+ # clone our repo
127
+ # --depth 1 removes all but one .git commit history
128
+ git clone --depth 1 https://github.com/DevExpress/devextreme-angular.git
129
+
130
+ # change directory to our repo
131
+ cd devextreme-angular
132
+
133
+ # install the repo with npm
134
+ npm install
135
+
136
+ # start the web-server
137
+ npm start
138
+
139
+ ```
140
+
141
+ Navigate to [http://127.0.0.1:8875/examples/](http://127.0.0.1:8875/examples/) in the opened browser window. Explore the **examples** folder of this repository for the examples source code.
142
+
143
+ ### <a name="jquery-integration"></a>Include jQuery integration ###
144
+ Starting with version 17.2, DevExtreme doesn't depend on jQuery. It means that our widgets work without jQuery elements. If you need to use jQuery, you can manually install the jquery npm package and include the jQuery integration as described below:
145
+
146
+ ```js
147
+ npm install --save jquery
148
+ ```
149
+
150
+ ```js
151
+ import 'devextreme/integration/jquery';
152
+ ```
153
+
154
+ ## <a name="usage-samples"></a>Usage Samples ##
155
+
156
+ ### <a name="static-option"></a>Static String Option Value ###
157
+
158
+ To specify a string widget's option statically
159
+ (the [text](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxButton/Configuration/#text)
160
+ option of dxButton):
161
+
162
+ ```html
163
+ <dx-button text="Simple button"></dx-button>
164
+ ```
165
+
166
+ ### <a name="static-non-string-option"></a>Static Non-string Option Value ###
167
+
168
+ To specify a non-string widget's option statically
169
+ (the [disabled](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxButton/Configuration/#disabled)
170
+ option of dxButton):
171
+
172
+ ```html
173
+ <dx-button [disabled]="false"></dx-button>
174
+ ```
175
+
176
+ ### <a name="event-handling"></a>Event Handling ###
177
+
178
+ To bind the dxButton’s [click](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxButton/Events/#click) event:
179
+
180
+ ```html
181
+ <dx-button (onClick)="handler()"></dx-button>
182
+ ```
183
+
184
+ ### <a name="callback-functions"></a>Callback Functions ###
185
+
186
+ To specify a widget's option using a callback function (the [layer.customize](https://js.devexpress.com/Documentation/ApiReference/Data_Visualization_Widgets/dxVectorMap/Configuration/layers/#customize)
187
+ option of dxVectorMap):
188
+
189
+ ```html
190
+ <dx-vector-map>
191
+ ...
192
+ <dxi-layer
193
+ ...
194
+ [customize]="customizeLayers">
195
+ </dxi-layer>
196
+ </dx-vector-map>
197
+ ```
198
+
199
+ Note that callback functions are executed _outside_ the context of the component, but if the context is important, you can explicitly bind it to the callback function in the constructor.
200
+
201
+ ```js
202
+ constructor() {
203
+ this.customizeLayers = this.customizeLayers.bind(this);
204
+ }
205
+
206
+ customizeLayers(elements) {
207
+ let country = this.myCountry;
208
+ ...
209
+ }
210
+ ```
211
+
212
+ ### <a name="one-way-binding"></a>One-way Option Binding ###
213
+
214
+ If we want changes to the value of ‘bindingProperty’ of the host component to propagate to the
215
+ [value](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxTextBox/Configuration/#value) of the dxTextBox widget,
216
+ a one-way binding approach is used:
217
+
218
+ ```html
219
+ <dx-text-box [value]="bindingProperty"></dx-text-box>
220
+ ```
221
+
222
+ ### <a name="two-way-binding"></a>Two-way Option Binding ###
223
+
224
+ In addition to the one-way binding, we can also perform two-way binding, which propagates changes from the bindingProperty to the widget
225
+ or vice versa from the widget to the bindingProperty:
226
+
227
+ ```html
228
+ <dx-text-box [(value)]="bindingProperty"></dx-text-box>
229
+ ```
230
+
231
+ ### <a name="custom-templates"></a>Custom Templates ###
232
+
233
+ In case you want to customize the rendering of a DevExtreme widget, we support custom templates. For instance, we can specify
234
+ the [itemTemplate](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxList/Configuration/#itemTemplate)
235
+ and [groupTemplate](http://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxList/Configuration/#groupTemplate)
236
+ of the dxList widget as follows:
237
+
238
+ ```html
239
+ <dx-list [grouped]="true" [items]="grouppedItems">
240
+ <div *dxTemplate="let itemData of 'item'; let itemIndex = index">
241
+ {{itemIndex}} - {{itemData.someProperty}}
242
+ </div>
243
+ <div *dxTemplate="let groupData of 'group'">
244
+ {{groupData.someProperty}}
245
+ </div>
246
+ </dx-list>
247
+ ```
248
+ The local 'itemData' and 'groupData' variables (that are declared via the 'let' keyword) expose the corresponding item data object. You can use it to
249
+ render the data where you need inside the template.
250
+
251
+ The 'item' and 'group' names are default template names for the 'itemTemplate' and 'groupTemplate' options of the dxList widget.
252
+
253
+ ### <a name="data-layer"></a>Data Layer ###
254
+
255
+ The DevExtreme framework includes a data layer, which is a set of complementary components that enable you to read and write data.
256
+ For more details please refer to [the documentation on the official website](https://js.devexpress.com/Documentation/Guide/Data_Layer/Data_Layer/).
257
+
258
+ ### <a name="devextreme-utils"></a>DevExtreme Utils ###
259
+
260
+ The DevExtreme provides utils that can be used in different application parts such as widgets and data. For more details please refer to [the documentation on the official website](https://js.devexpress.com/Documentation/ApiReference/Common/utils/).
261
+
262
+ ### <a name="components-with-transcluded-content"></a>Components with Transcluded Content ###
263
+
264
+ In addition to using dxTemplate, it is possible to put the content of the following widgets directly into the markup:
265
+ [dxResizable](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxResizable/),
266
+ [dxScrollView](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxScrollView/),
267
+ [dxValidationGroup](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxValidationGroup/).
268
+ For instance, we can set the content for
269
+ the [dxScrollView](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxScrollView/) widget as shown below:
270
+
271
+ ```html
272
+ <dx-scroll-view>
273
+ <div>Some scrollable content</div>
274
+ </dx-scroll-view>
275
+ ```
276
+
277
+ ### <a name="angular-forms"></a>Angular Forms ###
278
+
279
+ The DevExtreme Angular editors support the 'ngModel' binding as well as the 'formControlName' directive, which are necessary for the
280
+ [Angular forms](https://angular.io/docs/ts/latest/guide/forms.html) features.
281
+
282
+ ```html
283
+ <form [formGroup]="form">
284
+ <dx-text-box
285
+ name="email"
286
+ [(ngModel)]="email"
287
+ [isValid]="emailControl.valid || emailControl.pristine"
288
+ [validationError]="{ message: 'Email is invalid'}">
289
+ </dx-text-box>
290
+ </form>
291
+ ```
292
+
293
+
294
+ ```js
295
+ @Component({
296
+ selector: 'my-app',
297
+ templateUrl: 'app/app.component.html'
298
+ })
299
+ export class AppComponent implements OnInit {
300
+ email: string;
301
+ emailControl: AbstractControl;
302
+ form: FormGroup;
303
+ ngOnInit() {
304
+ this.form = new FormGroup({
305
+ email: new FormControl('', Validators.compose([Validators.required, CustomValidator.mailFormat]))
306
+ });
307
+ this.emailControl = this.form.controls['email'];
308
+ }
309
+ }
310
+ ```
311
+
312
+ ### <a name="devextreme-validation-features"></a>Using DevExtreme Validation Features ###
313
+
314
+ You can use the [built-in validators](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxValidator/Validation_Rules/),
315
+ validation summary and other DevExtreme validation features with Angular DevExtreme editors.
316
+
317
+
318
+ ```html
319
+ <dx-validation-group>
320
+
321
+ <dx-text-box [(value)]="email">
322
+ <dx-validator [validationRules]="validationRules.email"></dx-validator>
323
+ </dx-text-box>
324
+ <dx-text-box [(value)]="password" mode="password">
325
+ <dx-validator [validationRules]="validationRules.password"></dx-validator>
326
+ </dx-text-box>
327
+
328
+ <dx-validation-summary></dx-validation-summary>
329
+
330
+ <dx-button (onClick)="validate($event)" text="Submit"></dx-button>
331
+
332
+ </dx-validation-group>
333
+ ```
334
+
335
+
336
+ ```js
337
+ @Component({
338
+ selector: 'my-app',
339
+ templateUrl: 'app/app.component.html'
340
+ })
341
+ export class AppComponent {
342
+ email: string;
343
+ password: string;
344
+ validationRules = {
345
+ email: [
346
+ { type: 'required', message: 'Email is required.' },
347
+ { type: 'email', message: 'Email is invalid.' }
348
+ ],
349
+ password: [
350
+ { type: 'required', message: 'Email is required.' }
351
+ ]
352
+ };
353
+ validate(params) {
354
+ let result = params.validationGroup.validate();
355
+ if (result.isValid) {
356
+ // form data is valid
357
+ // params.validationGroup.reset();
358
+ }
359
+ }
360
+ }
361
+ ```
362
+
363
+
364
+ ### <a name="configuration-components"></a>Configuration Components ###
365
+
366
+ You can use `dxo-` ('o' is a contraction of 'option') prefixed components to configure complex nested options for widgets.
367
+ The following example demonstrates how to configure the [tooltip](https://js.devexpress.com/Documentation/ApiReference/Data_Visualization_Widgets/dxTreeMap/Configuration/tooltip/) option of the dxTreeMap widget:
368
+
369
+ ```html
370
+ <dx-tree-map [dataSource]="treeData">
371
+ <dxo-tooltip [enabled]="showTooltip" format="thousands"></dxo-tooltip>
372
+ </dx-tree-map>
373
+
374
+ <dx-button text="Toggle tooltip" (onClick)="toggleTooltip()"></dx-button>
375
+ ```
376
+
377
+ ```js
378
+ @Component({
379
+ selector: 'my-app',
380
+ templateUrl: 'app/app.component.html'
381
+ })
382
+ export class AppComponent {
383
+ treeData = ...;
384
+ showTooltip = false;
385
+ toggleTooltip() {
386
+ this.showTooltip = !this.showTooltip;
387
+ }
388
+ }
389
+ ```
390
+
391
+ You can also use `dxi-` ('i' is a contraction of 'item') prefixed components to configure complex collection options for widgets.
392
+ The following example demonstrates how to configure the [columns](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid/Configuration/columns/) option of the dxDataGrid widget:
393
+
394
+ ```html
395
+ <dx-data-grid [dataSource]="data">
396
+ <dxi-column dataField="firstName" caption="First Name"></dxi-column>
397
+ <dxi-column dataField="lastName" caption="Last Name" [visible]="showLastName"></dxi-column>
398
+ </dx-data-grid>
399
+
400
+ <dx-button text="Toggle the 'Last Name' column" (onClick)="toggleLastName()"></dx-button>
401
+ ```
402
+
403
+ ```js
404
+ @Component({
405
+ selector: 'my-app',
406
+ templateUrl: 'app/app.component.html'
407
+ })
408
+ export class AppComponent {
409
+ data = ...;
410
+ showLastName = false;
411
+ toggleLastName() {
412
+ this.showLastName = !this.showLastName;
413
+ }
414
+ }
415
+ ```
416
+
417
+ To configure options that can accept a configuration object or an array of configuration objects, use `dxi-` prefixed components.
418
+ The following example demonstrates how to configure the [valueAxis](https://js.devexpress.com/Documentation/ApiReference/Data_Visualization_Widgets/dxChart/Configuration/valueAxis/) option of the dxChart widget:
419
+
420
+ ```html
421
+ <dx-chart [dataSource]="data">
422
+ <dxi-series valueField="value" argumentField="argument"></dxi-series>
423
+ <dxi-value-axis>
424
+ <dxo-label format="millions"></dxo-label>
425
+ </dxi-value-axis>
426
+ </dx-chart>
427
+ ```
428
+
429
+ ```js
430
+ @Component({
431
+ selector: 'my-app',
432
+ templateUrl: 'app/app.component.html'
433
+ })
434
+ export class AppComponent {
435
+ data = ...;
436
+ }
437
+ ```
438
+
439
+ It is possible to specify an item template inside the `dxi-` prefixed components and use Angular
440
+ [structural directives](https://angular.io/docs/ts/latest/guide/structural-directives.html) such as ngFor. Note that
441
+ the available item properties are described in the [Default Item Template](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxList/Default_Item_Template/)
442
+ section of a corresponding widget documentation reference.
443
+
444
+ ```html
445
+ <dx-list>
446
+ <dxi-item>
447
+ <h1>Items available</h1>
448
+ </dxi-item>
449
+ <dxi-item *ngFor="let item of listItems" [badge]="item.badge">
450
+ <h2>{{item.text}}</h2>
451
+ </dxi-item>
452
+ </dx-list>
453
+ ```
454
+
455
+ ```js
456
+ @Component({
457
+ selector: 'my-app',
458
+ templateUrl: 'app/app.component.html'
459
+ })
460
+ export class AppComponent {
461
+ listItems = [
462
+ {
463
+ text: 'Cars',
464
+ badge: '12'
465
+ },
466
+ {
467
+ text: 'Bikes',
468
+ badge: '5'
469
+ }
470
+ ];
471
+ }
472
+ ```
473
+
474
+ If your item template contains some *nested* components, declare it using the parameterless `dxTemplate` structural directive as follows:
475
+
476
+ ```html
477
+ <dx-list>
478
+ <dxi-item>
479
+ <div *dxTemplate>
480
+ <dx-button text="I'm a nested child component"></dx-button>
481
+ </div>
482
+ </dxi-item>
483
+ </dx-list>
484
+ ```
485
+
486
+ Angular has a built-in `template` directive. To define the `template` property of the configuration component (for example, `dxo-master-detail`), use the following code:
487
+ ```html
488
+ <dxo-master-detail [template]="'masterDetail'"></dxo-master-detail>
489
+ ```
490
+
491
+ Note that some options with an object type are not implemented as nested components - for example,
492
+ [editorOptions of dxDataGrid](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid/Configuration/columns/#editorOptions), [editorOptions of dxForm](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxForm/Item_Types/SimpleItem/#editorOptions), [the widget option of dxToolbar](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxToolbar/Default_Item_Template/#options).
493
+
494
+ ### <a name="accessing-widget-instance"></a>Accessing a DevExtreme Widget Instance ###
495
+
496
+ You can access a DevExtreme widget instance using the `@ViewChild` or `@ViewChildren` decorator (depending on whether you are getting just one or several instances of one widget) and the component's
497
+ 'instance' property. Both decorators accept a component name or a [template reference variable](https://angular.io/guide/template-syntax#template-reference-variables--var-). In the example below, the
498
+ [refresh](https://js.devexpress.com/Documentation/ApiReference/UI_Widgets/dxDataGrid/Methods/#refresh)
499
+ method of the dxDataGrid is called:
500
+
501
+ ```js
502
+ import { Component, ViewChild } from '@angular/core';
503
+ import { DxDataGridComponent } from "devextreme-angular";
504
+
505
+ @Component({
506
+ selector: 'my-app',
507
+ template: `
508
+ <dx-data-grid #targetDataGrid [dataSource]="dataSource"></dx-data-grid>
509
+ <dx-button text="Refresh data" (onClick)="refresh()"></dx-button>
510
+ `
511
+ })
512
+ export class AppComponent implements OnChanges {
513
+ @ViewChild(DxDataGridComponent) dataGrid:DxDataGridComponent
514
+ // or
515
+ // @ViewChild("targetDataGrid") dataGrid: DxDataGridComponent
516
+ refresh() {
517
+ this.dataGrid.instance.refresh();
518
+ }
519
+ }
520
+ ```
521
+
522
+ To access a DevExtreme widget instance in markup, you can use the same template reference variables. The following example demonstrates how you can get a dxSelectBox value in the template.
523
+
524
+ ```html
525
+ <dx-select-box #selectbox [items]="items"></dx-select-box>
526
+ {{selectbox.value}}
527
+ ```
528
+
529
+ ### <a name="angular-change-detection"></a>Angular Change Detection ###
530
+
531
+ By default, in Angular, options changes are checked on each user action.
532
+ If you bind a widget option to this function, it should return a static object.
533
+ Otherwise, Angular considers that the option is constantly changed after each user action.
534
+ Alternatively, you can change the default behavior and set the [ChangeDetectionStrategy](https://angular.io/docs/ts/latest/api/core/index/ChangeDetectionStrategy-enum.html) component option to "OnPush".
535
+
536
+ ```js
537
+ import {Component, ChangeDetectionStrategy} from '@angular/core';
538
+
539
+ @Component({
540
+ selector: 'my-app',
541
+ ....
542
+ changeDetection: ChangeDetectionStrategy.OnPush
543
+ })
544
+ ```
545
+
546
+ ## <a name="demos"></a>Demos ##
547
+
548
+ * [GolfClub real-world application](https://devexpress.github.io/golfclub/) ([sources](https://github.com/DevExpress/golfclub))
549
+ * [Lots of feature-based examples](https://js.devexpress.com/Demos/WidgetsGallery/Demo/Data_Grid/LocalDataSource/Angular/Light/)
550
+
551
+ ## <a name="api-reference"></a>API Reference ##
552
+
553
+ DevExtreme Angular components mirror
554
+ [DevExtreme JavaScript API](http://js.devexpress.com/Documentation/ApiReference/) but use
555
+ [Angular syntax](#usage-samples) for specifying widget options, subscribing to events and custom templates declaration.
556
+
557
+ ## <a name="bundle-optimization"></a>Bundle Size Optimization ##
558
+
559
+ ### Bundlers with Tree Shaking Support ###
560
+
561
+ *Tree shaking* can greatly reduce the downloaded size of the application by removing unused portions of both source and library code. There are a number of
562
+ bundlers with tree shaking support, such as Webpack 2, Rollup, SystemJS Bundler, etc. Due to specifics of the tree shaking algorithm, your project typescript sources should
563
+ be prepared accordingly to make tree shaking available. This preparations are [performed by the Angular Compiler](https://angular.io/docs/ts/latest/cookbook/aot-compiler.html#!#tree-shaking).
564
+ You can follow one of the existing guides to configure tree shaking with your bundler ([Webpack 2](http://blog.rangle.io/optimize-your-angular2-application-with-tree-shaking/),
565
+ [Angular CLI](https://github.com/angular/angular-cli#bundling),
566
+ [Rollup](https://angular.io/docs/ts/latest/cookbook/aot-compiler.html#!#tree-shaking)).
567
+
568
+ To make it work with DevExtreme Angular package, you just need to import only the modules required in your application, not the whole DevExtremeModule. For instance,
569
+ you can import only DxButtonModule as follows:
570
+
571
+ ```js
572
+ import { DxButtonModule } from 'devextreme-angular';
573
+ ```
574
+
575
+ Note, AOT Compilation also decreases a bundle size by precompiling your HTML templates. So, the markup and the template compiler are not included into the final bundle.
576
+
577
+ ### Bundlers without Tree Shaking Support ###
578
+
579
+ If you are not going to configure tree shaking, you can optimize your bundle size by using imports from specific modules, not from the main 'devextreme-angular' module. You can do this
580
+ as follows:
581
+
582
+ ```js
583
+ import { DxButtonModule } from 'devextreme-angular/ui/button';
584
+ ```
585
+
586
+ ## <a name="server-side-rendering"></a>Server-side Rendering ##
587
+
588
+ Currently, DevExtreme components **do not support** server side rendering (check [this issue](https://github.com/DevExpress/devextreme-angular/issues/46)).
589
+ So, you are required to switch this feature off.
590
+
591
+ ## <a name="license"></a>License ##
592
+
593
+ Familiarize yourself with the
594
+ [DevExtreme License](https://js.devexpress.com/Licensing/).
595
+ [Free trial is available!](http://js.devexpress.com/Buy/)
596
+
597
+ **DevExtreme Angular components are released as a MIT-licensed (free and open-source) add-on to DevExtreme.**
598
+
599
+ ## <a name="support-feedback"></a>Support & Feedback ##
600
+
601
+ * For general Angular topics, follow [these guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md)
602
+ * For questions regarding DevExtreme libraries and JavaScript API, use [DevExpress Support Center](https://www.devexpress.com/Support/Center)
603
+ * For DevExtreme Angular integration bugs, questions and suggestions, use the [GitHub issue tracker](https://github.com/DevExpress/devextreme-angular/issues)