So far:
app.directive('xeditable', [ '$http', '$timeout', 'localize', function ($http, $timeout, localize) {
var save = function (url, params) {
var d = new $.Deferred;
var promise = $http
.post(url, params)
.success(function(data, status, headers, config) {
if(data.success == false) {
return d.reject(localize.getLocalizedString(data.error));
}
d.resolve();
})
.error(function(data, status, headers, config) {
console.log(["error", arguments]);
return d.reject(localize.getLocalizedString('a network error occured, please try again')); //returning error via deferred object
});
$timeout(function () {
promise.resolve();
}, 10);
return d.promise();
};
return {
restrict: 'A',
require: "ngModel",
link: function (scope, element, attrs, ngModel) {
// scope.$watch('ngModel', function (value) {
// console.log(value);
// });
var loadXeditable = function () {
angular.element(element).editable({
mode: 'popup',
value: scope.$eval(attrs.ngModel),
placement: 'top',
validate: function (value) {
var required = false;
if (attrs.required && (isEmpty(value) || value === false)) {
return localize.getLocalizedString("field is required");
}
var match = attrs.ngPattern.match(/^\/(.*)\/([gim]*)$/);
if (match) {
var pattern = new RegExp(match[1], match[2]);
if (isEmpty(value) || pattern.test(value)) {
return null;
}
if(attrs.patternMessage != void 0) {
return attrs.patternMessage
} else {
return localize.getLocalizedString("value is invalid");
}
}
},
url: function (params) {
return save(attrs.xeditable, params);
},
display: function (value, srcData) {
ngModel.$setViewValue(value);
scope.$apply();
}
});
}
$timeout(function () {
loadXeditable();
}, 10);
}
};
}]);