Skip to content

Instantly share code, notes, and snippets.

@jusopi
Created February 23, 2016 18:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jusopi/0a2f58e5d53bb954c0ef to your computer and use it in GitHub Desktop.
Save jusopi/0a2f58e5d53bb954c0ef to your computer and use it in GitHub Desktop.
Angular 1.x: Non-destructive Save-on-Blur Directive
.directive 'saveOnBlur', [
'$timeout'
($timeout)->
INPUT_SELECTOR = 'input, select, textarea'
IGNORE_SELECTOR = '.ignore-save-on-blur, .nx-save-ignore, .ignore-save, .save-ignore'
dir =
require: '^form'
restrict: 'A'
link: ($scope, elem, attrs, formCtrl)->
changingEvt = attrs.changingEvent or 'nx.viewData.changing'
saveExp = attrs.saveOnBlur
setLater = []
elem ready ->
elem.find(INPUT_SELECTOR).not(IGNORE_SELECTOR).bind 'blur', (evt)->
if formCtrl.$dirty and formCtrl.$valid
input = angular.element evt.target
ngModel = input?.controller 'ngModel'
$off_changing = $scope.$on changingEvt, ->
console.log 'on nx.viewData.changing'
dirty = formCtrl.modifiedModels.slice()
for ngm in dirty
if ngm isnt ngModel
setLater.push { model:ngm, value:ngm.$viewValue }
$off_changing()
$scope.$eval saveExp
.then ->
console.log 'rsp received, $setPristine called'
# dirty = formCtrl.modifiedModels.slice()
formCtrl.$setPristine()
$timeout ->
kvs = setLater.slice()
for kv in kvs
ngm = kv.model
ngm.$setViewValue kv.value
ngm.$render()
ngm.$setDirty()
_.pull setLater, kv
else
console.log 'save-on-blur didn\'t save'
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment