Explorar el Código

chained write filters should be applied in reverse order (fix #2447)

Evan You hace 10 años
padre
commit
5e8d6fedf9
Se han modificado 2 ficheros con 28 adiciones y 1 borrados
  1. 1 1
      src/instance/internal/misc.js
  2. 27 0
      test/unit/specs/instance/misc_spec.js

+ 1 - 1
src/instance/internal/misc.js

@@ -22,7 +22,7 @@ export default function (Vue) {
   Vue.prototype._applyFilters = function (value, oldValue, filters, write) {
     var filter, fn, args, arg, offset, i, l, j, k
     for (i = 0, l = filters.length; i < l; i++) {
-      filter = filters[i]
+      filter = filters[write ? l - i - 1 : i]
       fn = resolveAsset(this.$options, 'filters', filter.name)
       if (process.env.NODE_ENV !== 'production') {
         assertAsset(fn, 'filter', filter.name)

+ 27 - 0
test/unit/specs/instance/misc_spec.js

@@ -19,6 +19,22 @@ describe('misc', function () {
           write: function (v, oldV) {
             return v + ' ' + oldV
           }
+        },
+        duplex1: {
+          read: function (v) {
+            return v.split('').reverse().join('')
+          },
+          write: function (v) {
+            return v.split('').reverse().join('')
+          }
+        },
+        duplex2: {
+          read: function (v) {
+            return v + 'hi'
+          },
+          write: function (v) {
+            return v.replace('hi', '')
+          }
         }
       }
     })
@@ -40,6 +56,17 @@ describe('misc', function () {
       expect(val).toBe('test oldTest')
     })
 
+    it('chained read + write', function () {
+      var filters = [
+        { name: 'duplex1' },
+        { name: 'duplex2' }
+      ]
+      var val = vm._applyFilters('test', 'oldTest', filters)
+      expect(val).toBe('tsethi')
+      val = vm._applyFilters('tsethi', 'oldTest', filters, true)
+      expect(val).toBe('test')
+    })
+
     it('warn not found', function () {
       vm._applyFilters('what', null, [{name: 'wtf'}])
       expect('Failed to resolve filter').toHaveBeenWarned()