Przeglądaj źródła

fix checkbox value comparison and use looseEqual in comparisons

Evan You 10 lat temu
rodzic
commit
850646fc0b

+ 5 - 3
src/directives/model/checkbox.js

@@ -1,3 +1,5 @@
+var _ = require('../../util')
+
 module.exports = {
 
   bind: function () {
@@ -7,11 +9,11 @@ module.exports = {
     var falseExp = this._checkParam('false-exp')
 
     this._matchValue = function (value) {
-      var trueValue = true
       if (trueExp !== null) {
-        trueValue = self.vm.$eval(trueExp)
+        return _.looseEqual(value, self.vm.$eval(trueExp))
+      } else {
+        return !!value
       }
-      return trueValue === value
     }
 
     function getValue () {

+ 1 - 3
src/directives/model/radio.js

@@ -28,8 +28,6 @@ module.exports = {
   },
 
   update: function (value) {
-    /* eslint-disable eqeqeq */
-    this.el.checked = value == this.getValue()
-    /* eslint-enable eqeqeq */
+    this.el.checked = _.looseEqual(value, this.getValue())
   }
 }

+ 2 - 14
src/directives/model/select.js

@@ -65,7 +65,7 @@ module.exports = {
       /* eslint-disable eqeqeq */
       op.selected = multi
         ? indexOf(value, val) > -1
-        : equals(value, val)
+        : _.looseEqual(value, val)
       /* eslint-enable eqeqeq */
     }
   },
@@ -222,21 +222,9 @@ function getValue (el, multi) {
 function indexOf (arr, val) {
   var i = arr.length
   while (i--) {
-    if (equals(arr[i], val)) {
+    if (_.looseEqual(arr[i], val)) {
       return i
     }
   }
   return -1
 }
-
-/**
- * Check if two values are loosely equal. If two objects
- * have the same shape, they are considered equal too:
- *   equals({a: 1}, {a: 1}) => true
- */
-
-function equals (a, b) {
-  /* eslint-disable eqeqeq */
-  return a == b || JSON.stringify(a) == JSON.stringify(b)
-  /* eslint-enable eqeqeq */
-}

+ 19 - 0
src/util/lang.js

@@ -287,3 +287,22 @@ exports.cancellable = function (fn) {
   }
   return cb
 }
+
+/**
+ * Check if two values are loosely equal - that is,
+ * if they are plain objects, do they have the same shape?
+ *
+ * @param {*} a
+ * @param {*} b
+ * @return {Boolean}
+ */
+
+exports.looseEqual = function (a, b) {
+  /* eslint-disable eqeqeq */
+  return a == b || (
+    exports.isObject(a) && exports.isObject(b)
+      ? JSON.stringify(a) === JSON.stringify(b)
+      : false
+  )
+  /* eslint-enable eqeqeq */
+}

+ 8 - 0
test/unit/specs/util/lang_spec.js

@@ -138,4 +138,12 @@ describe('Util - Language Enhancement', function () {
       done()
     }, 200)
   })
+
+  it('looseEqual', function () {
+    expect(_.looseEqual(1, '1')).toBe(true)
+    expect(_.looseEqual(null, undefined)).toBe(true)
+    expect(_.looseEqual({a: 1}, {a: 1})).toBe(true)
+    expect(_.looseEqual({a: 1}, {a: 2})).toBe(false)
+    expect(_.looseEqual({}, [])).toBe(false)
+  })
 })