Ver Fonte

v-model with only write filters should not update DOM

Evan You há 11 anos atrás
pai
commit
b5ac185273

+ 2 - 1
src/directives/model/default.js

@@ -41,7 +41,8 @@ module.exports = {
     // the input with the filtered value.
     // also force update for type="range" inputs to enable
     // "lock in range" (see #506)
-    this.listener = this.filters || el.type === 'range'
+    var hasReadFilter = this.filters && this.filters.read
+    this.listener = hasReadFilter || el.type === 'range'
       ? function textInputListener () {
           if (cpLocked) return
           var charsOffset

+ 28 - 2
test/unit/specs/directives/model_spec.js

@@ -405,7 +405,7 @@ if (_.inBrowser) {
         filters: {
           test: {
             write: function (val) {
-              return val.toUpperCase()
+              return val.toLowerCase()
             }
           }
         },
@@ -416,6 +416,32 @@ if (_.inBrowser) {
       trigger(el.firstChild, 'input')
       _.nextTick(function () {
         expect(el.firstChild.value).toBe('CC')
+        expect(vm.test).toBe('cc')
+        done()
+      })
+    })
+
+    // when there's only write filter, should allow
+    // out of sync between the input field and actual data
+    it('text with only write filter', function (done) {
+      var vm = new Vue({
+        el: el,
+        data: {
+          test: 'b'
+        },
+        filters: {
+          test: {
+            write: function (val) {
+              return val.toUpperCase()
+            }
+          }
+        },
+        template: '<input v-model="test | test">'
+      })
+      el.firstChild.value = 'cc'
+      trigger(el.firstChild, 'input')
+      _.nextTick(function () {
+        expect(el.firstChild.value).toBe('cc')
         expect(vm.test).toBe('CC')
         done()
       })
@@ -474,7 +500,7 @@ if (_.inBrowser) {
           test: 'aaa',
           test2: 'bbb'
         },
-        template: '<input v-model="test"><input v-model="test2 | uppsercase">'
+        template: '<input v-model="test"><input v-model="test2 | uppercase">'
       })
       var input = el.firstChild
       var input2 = el.childNodes[1]