UNPKG

strong-arc

Version:

A visual suite for the StrongLoop API Platform

65 lines (57 loc) 2.52 kB
/** * General-purpose jQuery wrapper. Simply pass the plugin name as the expression. * * It is possible to specify a default set of parameters for each jQuery plugin. * Under the jq key, namespace each plugin by that which will be passed to ui-jq. * Unfortunately, at this time you can only pre-define the first parameter. * @example { jq : { datepicker : { showOn:'click' } } } * * @param ui-jq {string} The $elm.[pluginName]() to call. * @param [ui-options] {mixed} Expression to be evaluated and passed as options to the function * Multiple parameters can be separated by commas * @param [ui-refresh] {expression} Watch expression and refire plugin on changes * * @example <input ui-jq="datepicker" ui-options="{showOn:'click'},secondParameter,thirdParameter" ui-refresh="iChange"> */ angular.module('ui.directives').directive('uiJq', ['ui.config', '$timeout', function uiJqInjectingFunction(uiConfig, $timeout) { return { restrict: 'A', compile: function uiJqCompilingFunction(tElm, tAttrs) { if (!angular.isFunction(tElm[tAttrs.uiJq])) { throw new Error('ui-jq: The "' + tAttrs.uiJq + '" function does not exist'); } var options = uiConfig.jq && uiConfig.jq[tAttrs.uiJq]; return function uiJqLinkingFunction(scope, elm, attrs) { var linkOptions = []; // If ui-options are passed, merge (or override) them onto global defaults and pass to the jQuery method if (attrs.uiOptions) { linkOptions = scope.$eval('[' + attrs.uiOptions + ']'); if (angular.isObject(options) && angular.isObject(linkOptions[0])) { linkOptions[0] = angular.extend({}, options, linkOptions[0]); } } else if (options) { linkOptions = [options]; } // If change compatibility is enabled, the form input's "change" event will trigger an "input" event if (attrs.ngModel && elm.is('select,input,textarea')) { elm.on('change', function() { elm.trigger('input'); }); } // Call jQuery method and pass relevant options function callPlugin() { $timeout(function() { elm[attrs.uiJq].apply(elm, linkOptions); }, 0, false); } // If ui-refresh is used, re-fire the the method upon every change if (attrs.uiRefresh) { scope.$watch(attrs.uiRefresh, function(newVal) { callPlugin(); }); } callPlugin(); }; } }; }]);