diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dc3ce6..073b203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.3.0 / 2015-07-14 + +* Support reactivity (#6) + # v1.2.2 / 2015-07-10 * Fix validates option read access error (#32) diff --git a/bower.json b/bower.json index 2276cb7..4428b96 100644 --- a/bower.json +++ b/bower.json @@ -2,7 +2,7 @@ "name": "vue-validator", "main": "dist/vue-validator.js", "description": "Validator component for Vue.js", - "version": "1.2.2", + "version": "1.3.0", "homepage": "https://github.com/vuejs/vue-validator", "authors": [ "kazuya kawaguchi " diff --git a/component.json b/component.json index fd36de6..35bcab7 100644 --- a/component.json +++ b/component.json @@ -1,7 +1,7 @@ { "name": "vue-validator", "repo": "vuejs/vue-validator", - "version": "1.2.2", + "version": "1.3.0", "description": "Validator component for Vue.js", "main": "index.js", "license": "MIT" diff --git a/dist/vue-validator.js b/dist/vue-validator.js index 5c5f195..a1f7650 100644 --- a/dist/vue-validator.js +++ b/dist/vue-validator.js @@ -1,5 +1,5 @@ /** - * vue-validator v1.2.2 + * vue-validator v1.3.0 * (c) 2014-2015 kazuya kawaguchi * Released under the MIT License. */ @@ -98,7 +98,6 @@ return /******/ (function(modules) { // webpackBootstrap priority: 1024, bind: function () { - var self = this var vm = this.vm var el = this.el var $validator = vm[componentName] @@ -127,16 +126,32 @@ return /******/ (function(modules) { // webpackBootstrap $validator._addReadyEvents(keypath, this._checkParam('wait-for')) } - if (!$validator._isRegistedReadyEvent(keypath)) { - this._setupValidator($validator, keypath, validation, validator, arg, init) - } else { + this._setupValidator($validator, keypath, validation, validator, arg, init) + }, + + update: function (val, old) { + if (this._ignore) { return } + + var vm = this.vm + var keypath = this._keypath + var validator = this.arg ? this.arg : this.expression + var $validator = vm[componentName] + + $validator._changeValidator(keypath, validator, val) + if (!$validator._isRegistedReadyEvent(keypath)) { // normal + $validator._updateDirtyProperty(keypath, $validator.$get(keypath)) + $validator._doValidate(keypath, validator, $validator.$get(keypath)) + } else { // wait-for vm.$once($validator._getReadyEvents(keypath), function (val) { + $validator._setInitialValue(keypath, val) vm.$set(keypath, val) - self._setupValidator($validator, keypath, validation, validator, arg, val) + $validator._updateDirtyProperty(keypath, $validator.$get(keypath)) + $validator._doValidate(keypath, validator, $validator.$get(keypath)) }) } }, + unbind: function () { if (this._ignore) { return } @@ -161,18 +176,22 @@ return /******/ (function(modules) { // webpackBootstrap }, _setupValidator: function ($validator, keypath, validation, validator, arg, init) { + var vm = this.vm + if (!getVal($validator[validation], keypath)) { - $validator._defineModelValidationScope(keypath, init) + $validator._defineModelValidationScope(keypath) + $validator._setInitialValue(keypath, init) } if (!getVal($validator[validation], [keypath, validator].join('.'))) { $validator._defineValidatorToValidationScope(keypath, validator) - $validator._addValidators(keypath, validator, arg) + $validator._addValidator(keypath, validator, getVal(vm, arg) || arg) } $validator._addManagedValidator(keypath, validator) + }, - $validator._doValidate(keypath, init, $validator.$get(keypath)) + _updateValidator: function () { }, _teardownValidator: function (vm, $validator, keypath, validator) { @@ -234,10 +253,7 @@ return /******/ (function(modules) { // webpackBootstrap function pattern (val, pat) { if (typeof pat !== 'string') { return false } - var quoted = stripQuotes(pat) - if (!quoted) { return false } - - var match = quoted.match(new RegExp('^/(.*?)/([gimy]*)$')) + var match = pat.match(new RegExp('^/(.*?)/([gimy]*)$')) if (!match) { return false } return new RegExp(match[1], match[2]).test(val) @@ -323,22 +339,6 @@ return /******/ (function(modules) { // webpackBootstrap } - /** - * Strip quotes from a string - * - * @param {String} str - * @return {String | false} - */ - - function stripQuotes (str) { - var a = str.charCodeAt(0) - var b = str.charCodeAt(str.length - 1) - return a === b && (a === 0x22 || a === 0x27) - ? str.slice(1, -1) - : false - } - - /** * export(s) */ @@ -396,6 +396,7 @@ return /******/ (function(modules) { // webpackBootstrap _initValidationVariables: function () { this._validators = {} this._validates = {} + this._initialValues = {} for (var key in validates) { this._validates[key] = validates[key] } @@ -514,7 +515,7 @@ return /******/ (function(modules) { // webpackBootstrap this.$parent.$delete(this._getValidationNamespace('validation')) }, - _defineModelValidationScope: function (keypath, init) { + _defineModelValidationScope: function (keypath) { var self = this var validationName = this._getValidationNamespace('validation') var dirtyName = this._getValidationNamespace('dirty') @@ -552,7 +553,10 @@ return /******/ (function(modules) { // webpackBootstrap this._validators[keypath] = [] this._watchModel(keypath, function (val, old) { - self._doValidate(keypath, init, val) + self._updateDirtyProperty(keypath, val) + self._validators[keypath].forEach(function (validator) { + self._doValidate(keypath, validator.name, val) + }) }) }, @@ -587,10 +591,42 @@ return /******/ (function(modules) { // webpackBootstrap } }, - _addValidators: function (keypath, validator, arg) { + _getInitialValue: function (keypath) { + return this._initValidationVariables[keypath] + }, + + _setInitialValue: function (keypath, val) { + this._initValidationVariables[keypath] = val + }, + + _addValidator: function (keypath, validator, arg) { this._validators[keypath].push({ name: validator, arg: arg }) }, + _changeValidator: function (keypath, validator, arg) { + var validators = this._validators[keypath] + var i = validators.length + while (i--) { + if (validators[i].name === validator) { + validators[i].arg = arg + break + } + } + }, + + _findValidator: function (keypath, validator) { + var found = null + var validators = this._validators[keypath] + var i = validators.length + while (i--) { + if (validators[i].name === validator) { + found = validators[i] + break + } + } + return found + }, + _watchModel: function (keypath, fn) { this._validatorWatchers[keypath] = this.$watch(keypath, fn, { deep: false, immediate: true }) @@ -630,17 +666,25 @@ return /******/ (function(modules) { // webpackBootstrap return id in this._readyEvents }, - _doValidate: function (keypath, init, val) { - var self = this + _updateDirtyProperty: function (keypath, val) { var validationName = this._getValidationNamespace('validation') var dirtyName = this._getValidationNamespace('dirty') var target = getTarget(this[validationName], keypath) - target[dirtyName] = (init !== val) - this._validators[keypath].forEach(function (validator) { - target[validator.name] = - !self._validates[validator.name].call(self, val, validator.arg) - }) + target.$set(dirtyName, this._getInitialValue(keypath) !== val) + }, + + _doValidate: function (keypath, validateName, val) { + var validationName = this._getValidationNamespace('validation') + + var target = getTarget(this[validationName], keypath) + var validator = this._findValidator(keypath, validateName) + if (validator) { + target.$set( + validateName, + !this._validates[validateName].call(this, val, validator.arg) + ) + } } } } diff --git a/dist/vue-validator.min.js b/dist/vue-validator.min.js index 0ec2d3a..7a6731a 100644 --- a/dist/vue-validator.min.js +++ b/dist/vue-validator.min.js @@ -1,7 +1,7 @@ /** - * vue-validator v1.2.2 + * vue-validator v1.3.0 * (c) 2014-2015 kazuya kawaguchi * Released under the MIT License. */ -!function(t,i){"object"==typeof exports&&"object"==typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):"object"==typeof exports?exports["vue-validator"]=i():t["vue-validator"]=i()}(this,function(){return function(t){function i(a){if(e[a])return e[a].exports;var n=e[a]={exports:{},id:a,loaded:!1};return t[a].call(n.exports,n,n.exports,i),n.loaded=!0,n.exports}var e={};return i.m=t,i.c=e,i.p="",i(0)}([function(t,i,e){function a(t,i){function a(t,i){var e=null;try{e=d.get(t,i)}catch(a){}return e}i=i||{};var r=i.component=i.component||"$validator",o=i.directive=i.directive||"validate",d=t.parsers.path,s=t.util;t.directive(o,{priority:1024,bind:function(){var i=this,a=this.vm,o=this.el,d=a[r],l=this._keypath=this._parseModelAttribute(o.getAttribute(t.config.prefix+"model")),c=this.arg?this.arg:this.expression,u=this.arg?this.expression:null,h=a.$options.validator&&a.$options.validator.validates||{};if(!this._checkDirective(c,n,h))return s.warn("specified invalid v-validate directive !! please check v-validator directive !!"),void(this._ignore=!0);d||(a[r]=d=a.$addChild({validator:a.$options.validator},t.extend(e(2))));var f=d._getValidationNamespace("validation"),p=o.getAttribute("value")||a.$get(l),v=o.getAttribute("wait-for");v&&!d._isRegistedReadyEvent(l)&&d._addReadyEvents(l,this._checkParam("wait-for")),d._isRegistedReadyEvent(l)?a.$once(d._getReadyEvents(l),function(t){a.$set(l,t),i._setupValidator(d,l,f,c,u,t)}):this._setupValidator(d,l,f,c,u,p)},unbind:function(){if(!this._ignore){var t=this.vm,i=this._keypath,e=this.arg?this.arg:this.expression,a=t[r];this._teardownValidator(t,a,i,e)}},_parseModelAttribute:function(i){var e=t.parsers.directive.parse(i);return e[0].arg?e[0].arg:e[0].expression},_checkDirective:function(t,i,e){var a=Object.keys(i).concat(Object.keys(e));return a.some(function(i){return i===t})},_setupValidator:function(t,i,e,n,r,o){a(t[e],i)||t._defineModelValidationScope(i,o),a(t[e],[i,n].join("."))||(t._defineValidatorToValidationScope(i,n),t._addValidators(i,n,r)),t._addManagedValidator(i,n),t._doValidate(i,o,t.$get(i))},_teardownValidator:function(t,i,e,a){i._deleteManagedValidator(e,a),i._undefineValidatorToValidationScope(e,a),i._undefineModelValidationScope(e),i._isManagedValidator()||(i.$destroy(),t[r]=null,delete t[r])}})}var n=e(1);t.exports=a},function(t,i){function e(t){return Array.isArray(t)?t.length>0:null!==t&&"object"==typeof t?Object.keys(t).length>0:t?!0:!1}function a(t,i){if("string"!=typeof i)return!1;var e=l(i);if(!e)return!1;var a=e.match(new RegExp("^/(.*?)/([gimy]*)$"));return a?new RegExp(a[1],a[2]).test(t):!1}function n(t,i){return"string"==typeof t&&s(i,10)&&t.length>=parseInt(i,10)}function r(t,i){return"string"==typeof t&&s(i,10)&&t.length<=parseInt(i,10)}function o(t,i){return!isNaN(+t)&&!isNaN(+i)&&+t>=+i}function d(t,i){return!isNaN(+t)&&!isNaN(+i)&&+i>=+t}function s(t){return/^(-?[1-9]\d*|0)$/.test(t)}function l(t){var i=t.charCodeAt(0),e=t.charCodeAt(t.length-1);return i!==e||34!==i&&39!==i?!1:t.slice(1,-1)}t.exports={required:e,pattern:a,minLength:n,maxLength:r,min:o,max:d}},function(t,i,e){function a(t,i){for(var e,a,n=t,r=i.split("."),o=0;o0:null!==t&&"object"==typeof t?Object.keys(t).length>0:t?!0:!1}function a(t,i){if("string"!=typeof i)return!1;var e=i.match(new RegExp("^/(.*?)/([gimy]*)$"));return e?new RegExp(e[1],e[2]).test(t):!1}function n(t,i){return"string"==typeof t&&s(i,10)&&t.length>=parseInt(i,10)}function r(t,i){return"string"==typeof t&&s(i,10)&&t.length<=parseInt(i,10)}function o(t,i){return!isNaN(+t)&&!isNaN(+i)&&+t>=+i}function d(t,i){return!isNaN(+t)&&!isNaN(+i)&&+i>=+t}function s(t){return/^(-?[1-9]\d*|0)$/.test(t)}t.exports={required:e,pattern:a,minLength:n,maxLength:r,min:o,max:d}},function(t,i,e){function a(t,i){for(var e,a,n=t,r=i.split("."),o=0;o