|
|
@@ -1,5 +1,5 @@
|
|
|
/*!
|
|
|
- * Vue.js v1.0.21
|
|
|
+ * Vue.js v1.0.22
|
|
|
* (c) 2016 Evan You
|
|
|
* Released under the MIT License.
|
|
|
*/
|
|
|
@@ -46,6 +46,10 @@ function del(obj, key) {
|
|
|
delete obj[key];
|
|
|
var ob = obj.__ob__;
|
|
|
if (!ob) {
|
|
|
+ if (obj._isVue) {
|
|
|
+ delete obj._data[key];
|
|
|
+ obj._digest();
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
ob.dep.notify();
|
|
|
@@ -396,6 +400,8 @@ var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
|
|
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
|
|
|
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
|
|
|
var isAndroid = UA && UA.indexOf('android') > 0;
|
|
|
+var isIos = UA && /(iphone|ipad|ipod|ios)/i.test(UA);
|
|
|
+var isWechat = UA && UA.indexOf('micromessenger') > 0;
|
|
|
|
|
|
var transitionProp = undefined;
|
|
|
var transitionEndEvent = undefined;
|
|
|
@@ -436,7 +442,7 @@ var nextTick = (function () {
|
|
|
}
|
|
|
|
|
|
/* istanbul ignore if */
|
|
|
- if (typeof MutationObserver !== 'undefined') {
|
|
|
+ if (typeof MutationObserver !== 'undefined' && !(isWechat && isIos)) {
|
|
|
var counter = 1;
|
|
|
var observer = new MutationObserver(nextTickHandler);
|
|
|
var textNode = document.createTextNode(counter);
|
|
|
@@ -465,6 +471,27 @@ var nextTick = (function () {
|
|
|
};
|
|
|
})();
|
|
|
|
|
|
+var _Set = undefined;
|
|
|
+/* istanbul ignore if */
|
|
|
+if (typeof Set !== 'undefined' && Set.toString().match(/native code/)) {
|
|
|
+ // use native Set when available.
|
|
|
+ _Set = Set;
|
|
|
+} else {
|
|
|
+ // a non-standard Set polyfill that only works with primitive keys.
|
|
|
+ _Set = function () {
|
|
|
+ this.set = Object.create(null);
|
|
|
+ };
|
|
|
+ _Set.prototype.has = function (key) {
|
|
|
+ return this.set[key] !== undefined;
|
|
|
+ };
|
|
|
+ _Set.prototype.add = function (key) {
|
|
|
+ this.set[key] = 1;
|
|
|
+ };
|
|
|
+ _Set.prototype.clear = function () {
|
|
|
+ this.set = Object.create(null);
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
function Cache(limit) {
|
|
|
this.size = 0;
|
|
|
this.limit = limit;
|
|
|
@@ -1545,7 +1572,7 @@ function checkComponentAttr(el, options) {
|
|
|
if (resolveAsset(options, 'components', tag)) {
|
|
|
return { id: tag };
|
|
|
} else {
|
|
|
- var is = hasAttrs && getIsBinding(el);
|
|
|
+ var is = hasAttrs && getIsBinding(el, options);
|
|
|
if (is) {
|
|
|
return is;
|
|
|
} else if (process.env.NODE_ENV !== 'production') {
|
|
|
@@ -1558,7 +1585,7 @@ function checkComponentAttr(el, options) {
|
|
|
}
|
|
|
}
|
|
|
} else if (hasAttrs) {
|
|
|
- return getIsBinding(el);
|
|
|
+ return getIsBinding(el, options);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1566,14 +1593,18 @@ function checkComponentAttr(el, options) {
|
|
|
* Get "is" binding from an element.
|
|
|
*
|
|
|
* @param {Element} el
|
|
|
+ * @param {Object} options
|
|
|
* @return {Object|undefined}
|
|
|
*/
|
|
|
|
|
|
-function getIsBinding(el) {
|
|
|
+function getIsBinding(el, options) {
|
|
|
// dynamic syntax
|
|
|
- var exp = getAttr(el, 'is');
|
|
|
+ var exp = el.getAttribute('is');
|
|
|
if (exp != null) {
|
|
|
- return { id: exp };
|
|
|
+ if (resolveAsset(options, 'components', exp)) {
|
|
|
+ el.removeAttribute('is');
|
|
|
+ return { id: exp };
|
|
|
+ }
|
|
|
} else {
|
|
|
exp = getBindAttr(el, 'is');
|
|
|
if (exp != null) {
|
|
|
@@ -1684,7 +1715,7 @@ strats.init = strats.created = strats.ready = strats.attached = strats.detached
|
|
|
*/
|
|
|
|
|
|
function mergeAssets(parentVal, childVal) {
|
|
|
- var res = Object.create(parentVal);
|
|
|
+ var res = Object.create(parentVal || null);
|
|
|
return childVal ? extend(res, guardArrayAssets(childVal)) : res;
|
|
|
}
|
|
|
|
|
|
@@ -1843,8 +1874,16 @@ function guardArrayAssets(assets) {
|
|
|
function mergeOptions(parent, child, vm) {
|
|
|
guardComponents(child);
|
|
|
guardProps(child);
|
|
|
+ if (process.env.NODE_ENV !== 'production') {
|
|
|
+ if (child.propsData && !vm) {
|
|
|
+ warn('propsData can only be used as an instantiation option.');
|
|
|
+ }
|
|
|
+ }
|
|
|
var options = {};
|
|
|
var key;
|
|
|
+ if (child['extends']) {
|
|
|
+ parent = typeof child['extends'] === 'function' ? mergeOptions(parent, child['extends'].options, vm) : mergeOptions(parent, child['extends'], vm);
|
|
|
+ }
|
|
|
if (child.mixins) {
|
|
|
for (var i = 0, l = child.mixins.length; i < l; i++) {
|
|
|
parent = mergeOptions(parent, child.mixins[i], vm);
|
|
|
@@ -2277,11 +2316,14 @@ var util = Object.freeze({
|
|
|
devtools: devtools,
|
|
|
isIE9: isIE9,
|
|
|
isAndroid: isAndroid,
|
|
|
+ isIos: isIos,
|
|
|
+ isWechat: isWechat,
|
|
|
get transitionProp () { return transitionProp; },
|
|
|
get transitionEndEvent () { return transitionEndEvent; },
|
|
|
get animationProp () { return animationProp; },
|
|
|
get animationEndEvent () { return animationEndEvent; },
|
|
|
nextTick: nextTick,
|
|
|
+ get _Set () { return _Set; },
|
|
|
query: query,
|
|
|
inDoc: inDoc,
|
|
|
getAttr: getAttr,
|
|
|
@@ -2394,14 +2436,9 @@ function initMixin (Vue) {
|
|
|
this._updateRef();
|
|
|
|
|
|
// initialize data as empty object.
|
|
|
- // it will be filled up in _initScope().
|
|
|
+ // it will be filled up in _initData().
|
|
|
this._data = {};
|
|
|
|
|
|
- // save raw constructor data before merge
|
|
|
- // so that we know which properties are provided at
|
|
|
- // instantiation.
|
|
|
- this._runtimeData = options.data;
|
|
|
-
|
|
|
// call init hook
|
|
|
this._callHook('init');
|
|
|
|
|
|
@@ -2951,24 +2988,22 @@ var expression = Object.freeze({
|
|
|
// triggered, the DOM would have already been in updated
|
|
|
// state.
|
|
|
|
|
|
-var queueIndex;
|
|
|
var queue = [];
|
|
|
var userQueue = [];
|
|
|
var has = {};
|
|
|
var circular = {};
|
|
|
var waiting = false;
|
|
|
-var internalQueueDepleted = false;
|
|
|
|
|
|
/**
|
|
|
* Reset the batcher's state.
|
|
|
*/
|
|
|
|
|
|
function resetBatcherState() {
|
|
|
- queue = [];
|
|
|
- userQueue = [];
|
|
|
+ queue.length = 0;
|
|
|
+ userQueue.length = 0;
|
|
|
has = {};
|
|
|
circular = {};
|
|
|
- waiting = internalQueueDepleted = false;
|
|
|
+ waiting = false;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -2977,8 +3012,12 @@ function resetBatcherState() {
|
|
|
|
|
|
function flushBatcherQueue() {
|
|
|
runBatcherQueue(queue);
|
|
|
- internalQueueDepleted = true;
|
|
|
+ queue.length = 0;
|
|
|
runBatcherQueue(userQueue);
|
|
|
+ // user watchers triggered more internal watchers
|
|
|
+ if (queue.length) {
|
|
|
+ runBatcherQueue(queue);
|
|
|
+ }
|
|
|
// dev tool hook
|
|
|
/* istanbul ignore if */
|
|
|
if (devtools && config.devtools) {
|
|
|
@@ -2996,8 +3035,8 @@ function flushBatcherQueue() {
|
|
|
function runBatcherQueue(queue) {
|
|
|
// do not cache length because more watchers might be pushed
|
|
|
// as we run existing watchers
|
|
|
- for (queueIndex = 0; queueIndex < queue.length; queueIndex++) {
|
|
|
- var watcher = queue[queueIndex];
|
|
|
+ for (var i = 0; i < queue.length; i++) {
|
|
|
+ var watcher = queue[i];
|
|
|
var id = watcher.id;
|
|
|
has[id] = null;
|
|
|
watcher.run();
|
|
|
@@ -3026,20 +3065,14 @@ function runBatcherQueue(queue) {
|
|
|
function pushWatcher(watcher) {
|
|
|
var id = watcher.id;
|
|
|
if (has[id] == null) {
|
|
|
- if (internalQueueDepleted && !watcher.user) {
|
|
|
- // an internal watcher triggered by a user watcher...
|
|
|
- // let's run it immediately after current user watcher is done.
|
|
|
- userQueue.splice(queueIndex + 1, 0, watcher);
|
|
|
- } else {
|
|
|
- // push watcher into appropriate queue
|
|
|
- var q = watcher.user ? userQueue : queue;
|
|
|
- has[id] = q.length;
|
|
|
- q.push(watcher);
|
|
|
- // queue the flush
|
|
|
- if (!waiting) {
|
|
|
- waiting = true;
|
|
|
- nextTick(flushBatcherQueue);
|
|
|
- }
|
|
|
+ // push watcher into appropriate queue
|
|
|
+ var q = watcher.user ? userQueue : queue;
|
|
|
+ has[id] = q.length;
|
|
|
+ q.push(watcher);
|
|
|
+ // queue the flush
|
|
|
+ if (!waiting) {
|
|
|
+ waiting = true;
|
|
|
+ nextTick(flushBatcherQueue);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -3080,8 +3113,8 @@ function Watcher(vm, expOrFn, cb, options) {
|
|
|
this.dirty = this.lazy; // for lazy watchers
|
|
|
this.deps = [];
|
|
|
this.newDeps = [];
|
|
|
- this.depIds = Object.create(null);
|
|
|
- this.newDepIds = null;
|
|
|
+ this.depIds = new _Set();
|
|
|
+ this.newDepIds = new _Set();
|
|
|
this.prevError = null; // for async error stacks
|
|
|
// parse expression for getter/setter
|
|
|
if (isFn) {
|
|
|
@@ -3173,8 +3206,6 @@ Watcher.prototype.set = function (value) {
|
|
|
|
|
|
Watcher.prototype.beforeGet = function () {
|
|
|
Dep.target = this;
|
|
|
- this.newDepIds = Object.create(null);
|
|
|
- this.newDeps.length = 0;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -3185,10 +3216,10 @@ Watcher.prototype.beforeGet = function () {
|
|
|
|
|
|
Watcher.prototype.addDep = function (dep) {
|
|
|
var id = dep.id;
|
|
|
- if (!this.newDepIds[id]) {
|
|
|
- this.newDepIds[id] = true;
|
|
|
+ if (!this.newDepIds.has(id)) {
|
|
|
+ this.newDepIds.add(id);
|
|
|
this.newDeps.push(dep);
|
|
|
- if (!this.depIds[id]) {
|
|
|
+ if (!this.depIds.has(id)) {
|
|
|
dep.addSub(this);
|
|
|
}
|
|
|
}
|
|
|
@@ -3203,14 +3234,18 @@ Watcher.prototype.afterGet = function () {
|
|
|
var i = this.deps.length;
|
|
|
while (i--) {
|
|
|
var dep = this.deps[i];
|
|
|
- if (!this.newDepIds[dep.id]) {
|
|
|
+ if (!this.newDepIds.has(dep.id)) {
|
|
|
dep.removeSub(this);
|
|
|
}
|
|
|
}
|
|
|
+ var tmp = this.depIds;
|
|
|
this.depIds = this.newDepIds;
|
|
|
- var tmp = this.deps;
|
|
|
+ this.newDepIds = tmp;
|
|
|
+ this.newDepIds.clear();
|
|
|
+ tmp = this.deps;
|
|
|
this.deps = this.newDeps;
|
|
|
this.newDeps = tmp;
|
|
|
+ this.newDeps.length = 0;
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
@@ -3334,15 +3369,33 @@ Watcher.prototype.teardown = function () {
|
|
|
* @param {*} val
|
|
|
*/
|
|
|
|
|
|
-function traverse(val) {
|
|
|
- var i, keys;
|
|
|
- if (isArray(val)) {
|
|
|
- i = val.length;
|
|
|
- while (i--) traverse(val[i]);
|
|
|
- } else if (isObject(val)) {
|
|
|
- keys = Object.keys(val);
|
|
|
- i = keys.length;
|
|
|
- while (i--) traverse(val[keys[i]]);
|
|
|
+var seenObjects = new _Set();
|
|
|
+function traverse(val, seen) {
|
|
|
+ var i = undefined,
|
|
|
+ keys = undefined;
|
|
|
+ if (!seen) {
|
|
|
+ seen = seenObjects;
|
|
|
+ seen.clear();
|
|
|
+ }
|
|
|
+ var isA = isArray(val);
|
|
|
+ var isO = isObject(val);
|
|
|
+ if (isA || isO) {
|
|
|
+ if (val.__ob__) {
|
|
|
+ var depId = val.__ob__.dep.id;
|
|
|
+ if (seen.has(depId)) {
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ seen.add(depId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isA) {
|
|
|
+ i = val.length;
|
|
|
+ while (i--) traverse(val[i], seen);
|
|
|
+ } else if (isO) {
|
|
|
+ keys = Object.keys(val);
|
|
|
+ i = keys.length;
|
|
|
+ while (i--) traverse(val[keys[i]], seen);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -3451,10 +3504,13 @@ function stringToFragment(templateString, raw) {
|
|
|
|
|
|
function nodeToFragment(node) {
|
|
|
// if its a template tag and the browser supports it,
|
|
|
- // its content is already a document fragment.
|
|
|
+ // its content is already a document fragment. However, iOS Safari has
|
|
|
+ // bug when using directly cloned template content with touch
|
|
|
+ // events and can cause crashes when the nodes are removed from DOM, so we
|
|
|
+ // have to treat template elements as string templates. (#2805)
|
|
|
+ /* istanbul ignore if */
|
|
|
if (isRealTemplate(node)) {
|
|
|
- trimNode(node.content);
|
|
|
- return node.content;
|
|
|
+ return stringToFragment(node.innerHTML);
|
|
|
}
|
|
|
// script template
|
|
|
if (node.tagName === 'SCRIPT') {
|
|
|
@@ -3850,7 +3906,7 @@ function FragmentFactory(vm, el) {
|
|
|
this.vm = vm;
|
|
|
var template;
|
|
|
var isString = typeof el === 'string';
|
|
|
- if (isString || isTemplate(el)) {
|
|
|
+ if (isString || isTemplate(el) && !el.hasAttribute('v-if')) {
|
|
|
template = parseTemplate(el, true);
|
|
|
} else {
|
|
|
template = document.createDocumentFragment();
|
|
|
@@ -4192,7 +4248,15 @@ var vFor = {
|
|
|
});
|
|
|
setTimeout(op, staggerAmount);
|
|
|
} else {
|
|
|
- frag.before(prevEl.nextSibling);
|
|
|
+ var target = prevEl.nextSibling;
|
|
|
+ /* istanbul ignore if */
|
|
|
+ if (!target) {
|
|
|
+ // reset end anchor position in case the position was messed up
|
|
|
+ // by an external drag-n-drop library.
|
|
|
+ after(this.end, prevEl);
|
|
|
+ target = this.end;
|
|
|
+ }
|
|
|
+ frag.before(target);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
@@ -4263,7 +4327,7 @@ var vFor = {
|
|
|
var primitive = !isObject(value);
|
|
|
var id;
|
|
|
if (key || trackByKey || primitive) {
|
|
|
- id = trackByKey ? trackByKey === '$index' ? index : getPath(value, trackByKey) : key || value;
|
|
|
+ id = getTrackByKey(index, key, value, trackByKey);
|
|
|
if (!cache[id]) {
|
|
|
cache[id] = frag;
|
|
|
} else if (trackByKey !== '$index') {
|
|
|
@@ -4277,8 +4341,10 @@ var vFor = {
|
|
|
} else {
|
|
|
process.env.NODE_ENV !== 'production' && this.warnDuplicate(value);
|
|
|
}
|
|
|
- } else {
|
|
|
+ } else if (Object.isExtensible(value)) {
|
|
|
def(value, id, frag);
|
|
|
+ } else if (process.env.NODE_ENV !== 'production') {
|
|
|
+ warn('Frozen v-for objects cannot be automatically tracked, make sure to ' + 'provide a track-by key.');
|
|
|
}
|
|
|
}
|
|
|
frag.raw = value;
|
|
|
@@ -4298,7 +4364,7 @@ var vFor = {
|
|
|
var primitive = !isObject(value);
|
|
|
var frag;
|
|
|
if (key || trackByKey || primitive) {
|
|
|
- var id = trackByKey ? trackByKey === '$index' ? index : getPath(value, trackByKey) : key || value;
|
|
|
+ var id = getTrackByKey(index, key, value, trackByKey);
|
|
|
frag = this.cache[id];
|
|
|
} else {
|
|
|
frag = value[this.id];
|
|
|
@@ -4325,7 +4391,7 @@ var vFor = {
|
|
|
var key = hasOwn(scope, '$key') && scope.$key;
|
|
|
var primitive = !isObject(value);
|
|
|
if (trackByKey || key || primitive) {
|
|
|
- var id = trackByKey ? trackByKey === '$index' ? index : getPath(value, trackByKey) : key || value;
|
|
|
+ var id = getTrackByKey(index, key, value, trackByKey);
|
|
|
this.cache[id] = null;
|
|
|
} else {
|
|
|
value[this.id] = null;
|
|
|
@@ -4475,6 +4541,19 @@ function range(n) {
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * Get the track by key for an item.
|
|
|
+ *
|
|
|
+ * @param {Number} index
|
|
|
+ * @param {String} key
|
|
|
+ * @param {*} value
|
|
|
+ * @param {String} [trackByKey]
|
|
|
+ */
|
|
|
+
|
|
|
+function getTrackByKey(index, key, value, trackByKey) {
|
|
|
+ return trackByKey ? trackByKey === '$index' ? index : trackByKey.charAt(0).match(/\w/) ? getPath(value, trackByKey) : value[trackByKey] : key || value;
|
|
|
+}
|
|
|
+
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
|
vFor.warnDuplicate = function (value) {
|
|
|
warn('Duplicate value found in v-for="' + this.descriptor.raw + '": ' + JSON.stringify(value) + '. Use track-by="$index" if ' + 'you are expecting duplicate values.', this.vm);
|
|
|
@@ -5076,7 +5155,7 @@ var on$1 = {
|
|
|
}
|
|
|
// key filter
|
|
|
var keys = Object.keys(this.modifiers).filter(function (key) {
|
|
|
- return key !== 'stop' && key !== 'prevent' && key !== 'self';
|
|
|
+ return key !== 'stop' && key !== 'prevent' && key !== 'self' && key !== 'capture';
|
|
|
});
|
|
|
if (keys.length) {
|
|
|
handler = keyFilter(handler, keys);
|
|
|
@@ -5205,6 +5284,12 @@ function prefix(prop) {
|
|
|
}
|
|
|
var i = prefixes.length;
|
|
|
var prefixed;
|
|
|
+ if (camel !== 'filter' && camel in testEl.style) {
|
|
|
+ return {
|
|
|
+ kebab: prop,
|
|
|
+ camel: camel
|
|
|
+ };
|
|
|
+ }
|
|
|
while (i--) {
|
|
|
prefixed = camelPrefixes[i] + upper;
|
|
|
if (prefixed in testEl.style) {
|
|
|
@@ -5214,12 +5299,6 @@ function prefix(prop) {
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
- if (camel in testEl.style) {
|
|
|
- return {
|
|
|
- kebab: prop,
|
|
|
- camel: camel
|
|
|
- };
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
// xlink
|
|
|
@@ -5308,8 +5387,12 @@ var bind$1 = {
|
|
|
attr = camelize(attr);
|
|
|
}
|
|
|
if (!interp && attrWithPropsRE.test(attr) && attr in el) {
|
|
|
- el[attr] = attr === 'value' ? value == null // IE9 will set input.value to "null" for null...
|
|
|
+ var attrValue = attr === 'value' ? value == null // IE9 will set input.value to "null" for null...
|
|
|
? '' : value : value;
|
|
|
+
|
|
|
+ if (el[attr] !== attrValue) {
|
|
|
+ el[attr] = attrValue;
|
|
|
+ }
|
|
|
}
|
|
|
// set model props
|
|
|
var modelProp = modelProps[attr];
|
|
|
@@ -5409,66 +5492,66 @@ var vClass = {
|
|
|
deep: true,
|
|
|
|
|
|
update: function update(value) {
|
|
|
- if (value && typeof value === 'string') {
|
|
|
- this.handleObject(stringToObject(value));
|
|
|
- } else if (isPlainObject(value)) {
|
|
|
- this.handleObject(value);
|
|
|
- } else if (isArray(value)) {
|
|
|
- this.handleArray(value);
|
|
|
- } else {
|
|
|
+ if (!value) {
|
|
|
this.cleanup();
|
|
|
+ } else if (typeof value === 'string') {
|
|
|
+ this.setClass(value.trim().split(/\s+/));
|
|
|
+ } else {
|
|
|
+ this.setClass(normalize$1(value));
|
|
|
}
|
|
|
},
|
|
|
|
|
|
- handleObject: function handleObject(value) {
|
|
|
- this.cleanup(value);
|
|
|
- this.prevKeys = Object.keys(value);
|
|
|
- setObjectClasses(this.el, value);
|
|
|
- },
|
|
|
-
|
|
|
- handleArray: function handleArray(value) {
|
|
|
+ setClass: function setClass(value) {
|
|
|
this.cleanup(value);
|
|
|
for (var i = 0, l = value.length; i < l; i++) {
|
|
|
var val = value[i];
|
|
|
- if (val && isPlainObject(val)) {
|
|
|
- setObjectClasses(this.el, val);
|
|
|
- } else if (val && typeof val === 'string') {
|
|
|
- addClass(this.el, val);
|
|
|
+ if (val) {
|
|
|
+ apply(this.el, val, addClass);
|
|
|
}
|
|
|
}
|
|
|
- this.prevKeys = value.slice();
|
|
|
+ this.prevKeys = value;
|
|
|
},
|
|
|
|
|
|
cleanup: function cleanup(value) {
|
|
|
- if (!this.prevKeys) return;
|
|
|
-
|
|
|
- var i = this.prevKeys.length;
|
|
|
+ var prevKeys = this.prevKeys;
|
|
|
+ if (!prevKeys) return;
|
|
|
+ var i = prevKeys.length;
|
|
|
while (i--) {
|
|
|
- var key = this.prevKeys[i];
|
|
|
- if (!key) continue;
|
|
|
-
|
|
|
- var keys = isPlainObject(key) ? Object.keys(key) : [key];
|
|
|
- for (var j = 0, l = keys.length; j < l; j++) {
|
|
|
- toggleClasses(this.el, keys[j], removeClass);
|
|
|
+ var key = prevKeys[i];
|
|
|
+ if (!value || value.indexOf(key) < 0) {
|
|
|
+ apply(this.el, key, removeClass);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-function setObjectClasses(el, obj) {
|
|
|
- var keys = Object.keys(obj);
|
|
|
- for (var i = 0, l = keys.length; i < l; i++) {
|
|
|
- var key = keys[i];
|
|
|
- if (!obj[key]) continue;
|
|
|
- toggleClasses(el, key, addClass);
|
|
|
- }
|
|
|
-}
|
|
|
+/**
|
|
|
+ * Normalize objects and arrays (potentially containing objects)
|
|
|
+ * into array of strings.
|
|
|
+ *
|
|
|
+ * @param {Object|Array<String|Object>} value
|
|
|
+ * @return {Array<String>}
|
|
|
+ */
|
|
|
|
|
|
-function stringToObject(value) {
|
|
|
- var res = {};
|
|
|
- var keys = value.trim().split(/\s+/);
|
|
|
- for (var i = 0, l = keys.length; i < l; i++) {
|
|
|
- res[keys[i]] = true;
|
|
|
+function normalize$1(value) {
|
|
|
+ var res = [];
|
|
|
+ if (isArray(value)) {
|
|
|
+ for (var i = 0, l = value.length; i < l; i++) {
|
|
|
+ var _key = value[i];
|
|
|
+ if (_key) {
|
|
|
+ if (typeof _key === 'string') {
|
|
|
+ res.push(_key);
|
|
|
+ } else {
|
|
|
+ for (var k in _key) {
|
|
|
+ if (_key[k]) res.push(k);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (isObject(value)) {
|
|
|
+ for (var key in value) {
|
|
|
+ if (value[key]) res.push(key);
|
|
|
+ }
|
|
|
}
|
|
|
return res;
|
|
|
}
|
|
|
@@ -5484,14 +5567,12 @@ function stringToObject(value) {
|
|
|
* @param {Function} fn
|
|
|
*/
|
|
|
|
|
|
-function toggleClasses(el, key, fn) {
|
|
|
+function apply(el, key, fn) {
|
|
|
key = key.trim();
|
|
|
-
|
|
|
if (key.indexOf(' ') === -1) {
|
|
|
fn(el, key);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
// The key contains one or more space characters.
|
|
|
// Since a class name doesn't accept such characters, we
|
|
|
// treat it as multiple classes.
|
|
|
@@ -5542,6 +5623,7 @@ var component = {
|
|
|
// cached, when the component is used elsewhere this attribute
|
|
|
// will remain at link time.
|
|
|
this.el.removeAttribute('is');
|
|
|
+ this.el.removeAttribute(':is');
|
|
|
// remove ref, same as above
|
|
|
if (this.descriptor.ref) {
|
|
|
this.el.removeAttribute('v-ref:' + hyphenate(this.descriptor.ref));
|
|
|
@@ -5976,6 +6058,7 @@ function makePropsLinkFn(props) {
|
|
|
return function propsLinkFn(vm, scope) {
|
|
|
// store resolved props info
|
|
|
vm._props = {};
|
|
|
+ var inlineProps = vm.$options.propsData;
|
|
|
var i = props.length;
|
|
|
var prop, path, options, value, raw;
|
|
|
while (i--) {
|
|
|
@@ -5984,7 +6067,9 @@ function makePropsLinkFn(props) {
|
|
|
path = prop.path;
|
|
|
options = prop.options;
|
|
|
vm._props[path] = prop;
|
|
|
- if (raw === null) {
|
|
|
+ if (inlineProps && hasOwn(inlineProps, path)) {
|
|
|
+ initProp(vm, prop, inlineProps[path]);
|
|
|
+ }if (raw === null) {
|
|
|
// initialize absent prop
|
|
|
initProp(vm, prop, undefined);
|
|
|
} else if (prop.dynamic) {
|
|
|
@@ -6745,7 +6830,7 @@ function compile(el, options, partial) {
|
|
|
// link function for the node itself.
|
|
|
var nodeLinkFn = partial || !options._asComponent ? compileNode(el, options) : null;
|
|
|
// link function for the childNodes
|
|
|
- var childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && el.tagName !== 'SCRIPT' && el.hasChildNodes() ? compileNodeList(el.childNodes, options) : null;
|
|
|
+ var childLinkFn = !(nodeLinkFn && nodeLinkFn.terminal) && !isScript(el) && el.hasChildNodes() ? compileNodeList(el.childNodes, options) : null;
|
|
|
|
|
|
/**
|
|
|
* A composite linker function to be called on a already
|
|
|
@@ -6928,7 +7013,7 @@ function compileRoot(el, options, contextOptions) {
|
|
|
});
|
|
|
if (names.length) {
|
|
|
var plural = names.length > 1;
|
|
|
- warn('Attribute' + (plural ? 's ' : ' ') + names.join(', ') + (plural ? ' are' : ' is') + ' ignored on component ' + '<' + options.el.tagName.toLowerCase() + '> because ' + 'the component is a fragment instance: ' + 'http://vuejs.org/guide/components.html#Fragment_Instance');
|
|
|
+ warn('Attribute' + (plural ? 's ' : ' ') + names.join(', ') + (plural ? ' are' : ' is') + ' ignored on component ' + '<' + options.el.tagName.toLowerCase() + '> because ' + 'the component is a fragment instance: ' + 'http://vuejs.org/guide/components.html#Fragment-Instance');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -6965,7 +7050,7 @@ function compileRoot(el, options, contextOptions) {
|
|
|
|
|
|
function compileNode(node, options) {
|
|
|
var type = node.nodeType;
|
|
|
- if (type === 1 && node.tagName !== 'SCRIPT') {
|
|
|
+ if (type === 1 && !isScript(node)) {
|
|
|
return compileElement(node, options);
|
|
|
} else if (type === 3 && node.data.trim()) {
|
|
|
return compileTextNode(node, options);
|
|
|
@@ -7260,7 +7345,6 @@ function checkTerminalDirectives(el, attrs, options) {
|
|
|
var attr, name, value, modifiers, matched, dirName, rawName, arg, def, termDef;
|
|
|
for (var i = 0, j = attrs.length; i < j; i++) {
|
|
|
attr = attrs[i];
|
|
|
- modifiers = parseModifiers(attr.name);
|
|
|
name = attr.name.replace(modifierRE, '');
|
|
|
if (matched = name.match(dirAttrRE)) {
|
|
|
def = resolveAsset(options, 'directives', matched[1]);
|
|
|
@@ -7268,6 +7352,7 @@ function checkTerminalDirectives(el, attrs, options) {
|
|
|
if (!termDef || (def.priority || DEFAULT_TERMINAL_PRIORITY) > termDef.priority) {
|
|
|
termDef = def;
|
|
|
rawName = attr.name;
|
|
|
+ modifiers = parseModifiers(attr.name);
|
|
|
value = attr.value;
|
|
|
dirName = matched[1];
|
|
|
arg = matched[2];
|
|
|
@@ -7488,6 +7573,10 @@ function hasOneTime(tokens) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function isScript(el) {
|
|
|
+ return el.tagName === 'SCRIPT' && (!el.hasAttribute('type') || el.getAttribute('type') === 'text/javascript');
|
|
|
+}
|
|
|
+
|
|
|
var specialCharRE = /[^\w\-:\.]/;
|
|
|
|
|
|
/**
|
|
|
@@ -7617,8 +7706,8 @@ function mergeAttrs(from, to) {
|
|
|
value = attrs[i].value;
|
|
|
if (!to.hasAttribute(name) && !specialCharRE.test(name)) {
|
|
|
to.setAttribute(name, value);
|
|
|
- } else if (name === 'class' && !parseText(value)) {
|
|
|
- value.trim().split(/\s+/).forEach(function (cls) {
|
|
|
+ } else if (name === 'class' && !parseText(value) && (value = value.trim())) {
|
|
|
+ value.split(/\s+/).forEach(function (cls) {
|
|
|
addClass(to, cls);
|
|
|
});
|
|
|
}
|
|
|
@@ -7657,6 +7746,10 @@ function resolveSlots(vm, content) {
|
|
|
contents[name] = extractFragment(contents[name], content);
|
|
|
}
|
|
|
if (content.hasChildNodes()) {
|
|
|
+ var nodes = content.childNodes;
|
|
|
+ if (nodes.length === 1 && nodes[0].nodeType === 3 && !nodes[0].data.trim()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
contents['default'] = extractFragment(content.childNodes, content);
|
|
|
}
|
|
|
}
|
|
|
@@ -7756,7 +7849,6 @@ function stateMixin (Vue) {
|
|
|
process.env.NODE_ENV !== 'production' && warn('data functions should return an object.', this);
|
|
|
}
|
|
|
var props = this._props;
|
|
|
- var runtimeData = this._runtimeData ? typeof this._runtimeData === 'function' ? this._runtimeData() : this._runtimeData : null;
|
|
|
// proxy data on instance
|
|
|
var keys = Object.keys(data);
|
|
|
var i, key;
|
|
|
@@ -7767,10 +7859,10 @@ function stateMixin (Vue) {
|
|
|
// 1. it's not already defined as a prop
|
|
|
// 2. it's provided via a instantiation option AND there are no
|
|
|
// template prop present
|
|
|
- if (!props || !hasOwn(props, key) || runtimeData && hasOwn(runtimeData, key) && props[key].raw === null) {
|
|
|
+ if (!props || !hasOwn(props, key)) {
|
|
|
this._proxy(key);
|
|
|
} else if (process.env.NODE_ENV !== 'production') {
|
|
|
- warn('Data field "' + key + '" is already defined ' + 'as a prop. Use prop default value instead.', this);
|
|
|
+ warn('Data field "' + key + '" is already defined ' + 'as a prop. To provide default value for a prop, use the "default" ' + 'prop option; if you want to pass prop values to an instantiation ' + 'call, use the "propsData" option.', this);
|
|
|
}
|
|
|
}
|
|
|
// observe data
|
|
|
@@ -7960,18 +8052,21 @@ function eventsMixin (Vue) {
|
|
|
|
|
|
function registerComponentEvents(vm, el) {
|
|
|
var attrs = el.attributes;
|
|
|
- var name, handler;
|
|
|
+ var name, value, handler;
|
|
|
for (var i = 0, l = attrs.length; i < l; i++) {
|
|
|
name = attrs[i].name;
|
|
|
if (eventRE.test(name)) {
|
|
|
name = name.replace(eventRE, '');
|
|
|
- handler = (vm._scope || vm._context).$eval(attrs[i].value, true);
|
|
|
- if (typeof handler === 'function') {
|
|
|
- handler._fromParent = true;
|
|
|
- vm.$on(name.replace(eventRE), handler);
|
|
|
- } else if (process.env.NODE_ENV !== 'production') {
|
|
|
- warn('v-on:' + name + '="' + attrs[i].value + '" ' + 'expects a function value, got ' + handler, vm);
|
|
|
+ // force the expression into a statement so that
|
|
|
+ // it always dynamically resolves the method to call (#2670)
|
|
|
+ // kinda ugly hack, but does the job.
|
|
|
+ value = attrs[i].value;
|
|
|
+ if (isSimplePath(value)) {
|
|
|
+ value += '.apply(this, $arguments)';
|
|
|
}
|
|
|
+ handler = (vm._scope || vm._context).$eval(value, true);
|
|
|
+ handler._fromParent = true;
|
|
|
+ vm.$on(name.replace(eventRE), handler);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -8622,7 +8717,7 @@ function lifecycleMixin (Vue) {
|
|
|
}
|
|
|
// remove reference from data ob
|
|
|
// frozen object may not have observer.
|
|
|
- if (this._data.__ob__) {
|
|
|
+ if (this._data && this._data.__ob__) {
|
|
|
this._data.__ob__.removeVm(this);
|
|
|
}
|
|
|
// Clean up references to private properties and other
|
|
|
@@ -8695,6 +8790,7 @@ function miscMixin (Vue) {
|
|
|
} else {
|
|
|
factory = resolveAsset(this.$options, 'components', value, true);
|
|
|
}
|
|
|
+ /* istanbul ignore if */
|
|
|
if (!factory) {
|
|
|
return;
|
|
|
}
|
|
|
@@ -8744,7 +8840,7 @@ function dataAPI (Vue) {
|
|
|
Vue.prototype.$get = function (exp, asStatement) {
|
|
|
var res = parseExpression(exp);
|
|
|
if (res) {
|
|
|
- if (asStatement && !isSimplePath(exp)) {
|
|
|
+ if (asStatement) {
|
|
|
var self = this;
|
|
|
return function statementHandler() {
|
|
|
self.$arguments = toArray(arguments);
|
|
|
@@ -9676,17 +9772,19 @@ var filters = {
|
|
|
* 12345 => $12,345.00
|
|
|
*
|
|
|
* @param {String} sign
|
|
|
+ * @param {Number} decimals Decimal places
|
|
|
*/
|
|
|
|
|
|
- currency: function currency(value, _currency) {
|
|
|
+ currency: function currency(value, _currency, decimals) {
|
|
|
value = parseFloat(value);
|
|
|
if (!isFinite(value) || !value && value !== 0) return '';
|
|
|
_currency = _currency != null ? _currency : '$';
|
|
|
- var stringified = Math.abs(value).toFixed(2);
|
|
|
- var _int = stringified.slice(0, -3);
|
|
|
+ decimals = decimals != null ? decimals : 2;
|
|
|
+ var stringified = Math.abs(value).toFixed(decimals);
|
|
|
+ var _int = decimals ? stringified.slice(0, -1 - decimals) : stringified;
|
|
|
var i = _int.length % 3;
|
|
|
var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? ',' : '') : '';
|
|
|
- var _float = stringified.slice(-3);
|
|
|
+ var _float = decimals ? stringified.slice(-1 - decimals) : '';
|
|
|
var sign = value < 0 ? '-' : '';
|
|
|
return sign + _currency + head + _int.slice(i).replace(digitsRE, '$1,') + _float;
|
|
|
},
|
|
|
@@ -9906,7 +10004,7 @@ function installGlobalAPI (Vue) {
|
|
|
|
|
|
installGlobalAPI(Vue);
|
|
|
|
|
|
-Vue.version = '1.0.21';
|
|
|
+Vue.version = '1.0.22';
|
|
|
|
|
|
// devtools global hook
|
|
|
/* istanbul ignore next */
|