14.5.0 • Published 6 years ago

angular-selector-on-steroids v14.5.0

Weekly downloads
5
License
ISC
Repository
-
Last release
6 years ago

angular-selector-on-steroids

NPM version NPM downloads MIT License

angular-selector-on-steroids is a native AngularJS (1.6.x) directive that transforms a simple <select> html tag into a full html select with typeahead/ autocompletion. This component is a shameless upgrade to the angular-selector directive, which has been booted up with steroids to circumvent the limitations faced by with the older implementation, such as bad-performance, too many digest cycles and unnecessary watchers.

Why was there a need to upgrade?

The angular-selector although a well authored component, does not cater to large data-sets in terms of both limiting the amount of repeated processes/ iterations/ functions, and did not embrace better rendering and updating logic. Eventually it relied heavily on AngularJs two way data-binding which drove the performance to a stand-still for even a data-set with 1000 items. This created huge memory bloat and lag in the UI. It was time to upgrade the component.

What has been done as a part of upgrade?

  • Moved to Typescript, obvious reason being better typing and to expose interface of the component to the real consumers. (Previously just js soup).
  • Better abstraction and separation of concerns. (Previously non-modular code.)
  • Moved the build/ bundling to webpack, to allow for tree-shaking and packaged as UMD to allow imports. (Previously inline scripts).
  • Re-authored in es6, keeping up with better coding standards (Previously es5).
  • Every directive is a class, embracing OOP (Previously functional).
  • Data marshalling via RxJs, better pub-sub model of communication with in the modules (Previously callback pattern).
  • Rendering of html, moved from being dependent on angular DOM manipulation to Virtual dom's diff and patch mechanism, using virtual-dom and hyperx libraries. This provided significant performance boost in rendering. (Previously ng-x repeats and ng-x dom manipulators).

Dependencies

  • Just AngularJS!
  • Other dependencies are bundled into the UMD module.

Features

  • The feature set remains the same as the forked component, please refer original documentation here.
  • The extra added feature is called steroids. To enable better rendering and performance boost, set steroids=true in the configuration object.
  • 100% fallback (reverse compatible) to orignial component logic, by setting a boolean values steroids=false the older way of rendering and non-performance component can be used.

Limitations

  • As the template generation & DOM Manipulation logic was moved virtual-dom and hyperx the current generated template abides by label & value attribute passed for binding interpolation.
  • For any complex dropdown or view item template a JSON structure of the object is shown. Kindly fallback to non-steroids version steroids=false if you need custom and complex template logic.

Examples

  • I have extended the example to a comparitive example of previous (steroids=false) vs new (steroids=true) implementation, to highlight difference in performance. // TODO: Check example link
  • An interactive version of all examples is accesible here https://jkodu.github.io/angular-selector-on-steroids

Installation

npm install --save angular-selector-on-steroids

Usage:

import * as sos from '../dist/angular-selector-on-steroids';
new sos.AngularSelectorOnSteroids().init();

const app = angular.module('MyApp', ['selectorOnSteroids']);
<select 
    selector-on-steroids
    steroids="true"    
    model="selectedObj" 
    options="arrayOfOptions" 
    value-attr="code" 
    >
</select>

Options/ Configuration

ParameterTypeDefaultDescription
steroidsBooleanfalseEnable/disable the get performance boost in rendering and data marshalling.
remoteCancelPendingXhrBooleanfalseEnable/disable pending request cancellation, on new XHR requests.
modelPropertyTwo-way binding property that models the select view.
nameStringInput name attribute.
disableBooleanfalseEnable/disable the select. Note the name is disable not disabled to avoid collisions with the HTML5 disabled attribute.
disableSearchBooleanfalseEnable/disable the search input field.
requireBooleanfalseSets required validation. Note the name is require not required to avoid collisions with the HTML5 required attribute.
multiBooleanfalseAllows to select more than one value. Note the name is multi not multiple to avoid collisions with the HTML5 multiple attribute.
limitIntegerInfinityMaximum number of selectable items when multi is true.
placeholderStringOptional placeholder text to display if input is empty.
optionsArray[]Set of options to display.Each object must contain a label key and a value key, otherwise you need to use a custom template (viewItemTemplate and dropdownItemTemplate) or change the default values of valueAttr and labelAttr properties.
valueAttrStringnullName of the value key in options array. This also sets the type of result for the model: if you don't set this attribute (null by default) the entire object option is returned, otherwise it will be returned only the selected property.
labelAttrString"label"Name of the label key in options array.
groupAttrString"group"Name of the optgroup label key in options array. It allows to group items by the selected key. Items have to be already sorted to see the groups just one time.
debounceInteger0Debounce model update value in milliseconds.
rtlBooleanfalseTwo-way bindable attribute to set Right-To-Left text direction.
apiObject{}This object is equipped with the methods for interacting with the selector. Check out the "APIs" example.
createBoolean or Function or PromiseAllows users to type the label of their own options and push them into the list. You can pass a function that returns the full format of the option, using input as parameter, a Promise, or set it to true to let Angular Selector create an object with the default properties given by valueAttr and labelAttr. Check out "Create custom options" and "Create custom options (using Promise)" examples.
changeFunctionCallback fired every time the selected values change. It provides two parameters: newValue and oldValue.
remoteObject or Promise{ method: 'GET', cache: true, params: {}}You can use remote data fetching with the native $http service or with your own custom service. In the first case this parameter must be the configuration object to pass to the native $http service (docs). In the second case, remote is a function that returns a Promise object.
remoteParamString"q"If remote attribute is used with the native $http service, this parameter is the name of the query key in the params object. You should use this to perform server-side filtering.
remoteValidationObject or Promise{ method: 'GET', cache: true, params: {}}This should be used to perform validation after a "manual" update of the model. It has the same structure of the remote property, check out "Remote fetching and validation" example.
remoteValidationParamString"value"If remoteValidation attribute is used with the native $http service, this parameter is the name of the query key in the params object.
removeButtonBooleantrueTwo-way bindable attribute to show the remove button (cross icon).
softDeleteBooleanfalseIf disableSearch is false, restores the last selected input text (using labelAttr attribute) after pressing Backspace.
closeAfterSelectionBooleanfalseClose dropdown after selecting an item.
viewItemTemplateString"selector/item-default.html"Template URL for the selected item(s).
dropdownItemTemplateString"selector/item-default.html"Template URL for each item in the dropdown list.
dropdownCreateTemplateString"selector/item-create.html"Template URL for the dropdown element for the new items.
dropdownGroupTemplateString"selector/group-default.html"Template URL for each group (header) in the dropdown list.

Roadmap & Why there is no need to PR to original project

  • The code has matured to newer standards of Angular and Javascript, and hence there is no reason to update the older component.
  • The plan is to abstract the selector logic to pure Js and provide a bolt-on AngularJs and Angular component.

Contributions

  • PR's are welcome.
  • Please raise issues if any.

License

Licensed under the MIT license.

Local Development

  • npm install
  • npm run build-prod - generates a dist directory ready for publishing.
  • npm run build - generates the demo/dist directory for local development (no watch).
  • npm run dev - builds and watches both source and sandbox directory for local development.
  • npm run serve - boots up a http-server and serves the demo directory.
14.5.0

6 years ago

14.4.0

6 years ago

14.3.0

6 years ago

13.2.1

6 years ago

12.1.1

6 years ago

14.2.0

6 years ago

14.1.0

6 years ago

14.0.0

6 years ago

13.2.0

6 years ago

13.1.0

6 years ago

13.0.0

6 years ago

12.9.0

6 years ago

12.8.0

6 years ago

12.7.0

6 years ago

12.6.0

6 years ago

12.5.0

6 years ago

12.4.0

6 years ago

12.3.0

6 years ago

12.2.0

6 years ago

12.1.0

6 years ago

12.0.0

6 years ago

11.1.0

6 years ago

11.0.0

6 years ago

10.2.0

7 years ago

10.1.0

7 years ago

10.0.0

7 years ago

9.0.0

7 years ago

8.0.0

7 years ago

7.0.0

7 years ago

6.0.0

7 years ago

5.0.0

7 years ago

4.0.0

7 years ago

3.0.0

7 years ago

2.0.0

7 years ago

1.0.0

7 years ago

0.4.6

7 years ago