Skip to content

Commit 5e8d6fe

Browse files
committed
chained write filters should be applied in reverse order (fix #2447)
1 parent c915cf4 commit 5e8d6fe

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/instance/internal/misc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default function (Vue) {
2222
Vue.prototype._applyFilters = function (value, oldValue, filters, write) {
2323
var filter, fn, args, arg, offset, i, l, j, k
2424
for (i = 0, l = filters.length; i < l; i++) {
25-
filter = filters[i]
25+
filter = filters[write ? l - i - 1 : i]
2626
fn = resolveAsset(this.$options, 'filters', filter.name)
2727
if (process.env.NODE_ENV !== 'production') {
2828
assertAsset(fn, 'filter', filter.name)

test/unit/specs/instance/misc_spec.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,22 @@ describe('misc', function () {
1919
write: function (v, oldV) {
2020
return v + ' ' + oldV
2121
}
22+
},
23+
duplex1: {
24+
read: function (v) {
25+
return v.split('').reverse().join('')
26+
},
27+
write: function (v) {
28+
return v.split('').reverse().join('')
29+
}
30+
},
31+
duplex2: {
32+
read: function (v) {
33+
return v + 'hi'
34+
},
35+
write: function (v) {
36+
return v.replace('hi', '')
37+
}
2238
}
2339
}
2440
})
@@ -40,6 +56,17 @@ describe('misc', function () {
4056
expect(val).toBe('test oldTest')
4157
})
4258

59+
it('chained read + write', function () {
60+
var filters = [
61+
{ name: 'duplex1' },
62+
{ name: 'duplex2' }
63+
]
64+
var val = vm._applyFilters('test', 'oldTest', filters)
65+
expect(val).toBe('tsethi')
66+
val = vm._applyFilters('tsethi', 'oldTest', filters, true)
67+
expect(val).toBe('test')
68+
})
69+
4370
it('warn not found', function () {
4471
vm._applyFilters('what', null, [{name: 'wtf'}])
4572
expect('Failed to resolve filter').toHaveBeenWarned()

0 commit comments

Comments
 (0)