You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.5 KiB
JavaScript
65 lines
2.5 KiB
JavaScript
/**
|
|
* 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();
|
|
};
|
|
}
|
|
};
|
|
}]);
|