Procházet zdrojové kódy

fix orderBy on object-converted v-repeat using literal keys (#825)

Evan You před 11 roky
rodič
revize
38bdbda92d

+ 4 - 0
src/filters/array-filters.js

@@ -61,6 +61,10 @@ exports.orderBy = function (arr, sortKey, reverseKey) {
   }
   // sort on a copy to avoid mutating original array
   return arr.slice().sort(function (a, b) {
+    if (key !== '$key' && key !== '$value') {
+      if (a && '$value' in a) a = a.$value
+      if (b && '$value' in b) b = b.$value
+    }
     a = _.isObject(a) ? Path.get(a, key) : a
     b = _.isObject(b) ? Path.get(b, key) : b
     return a === b ? 0 : a > b ? order : -order

+ 29 - 0
test/unit/specs/filters/filters_spec.js

@@ -181,6 +181,35 @@ describe('Filters', function () {
     res = filter.call(new Vue(), arr, 'abc')
     expect(res).toBe(arr)
   })
+
+  it('orderBy on Object-converted array', function () {
+    // object converted
+    var filter = filters.orderBy
+    var vm = new Vue()
+    var arr = [
+      { $key: 'a', $value: 3 },
+      { $key: 'c', $value: 1 },
+      { $key: 'b', $value: 2 }
+    ]
+    var res = filter.call(vm, arr, '"$key"')
+    expect(res[0].$value).toBe(3)
+    expect(res[1].$value).toBe(2)
+    expect(res[2].$value).toBe(1)
+    res = filter.call(vm, arr, '"$value"')
+    expect(res[0].$value).toBe(1)
+    expect(res[1].$value).toBe(2)
+    expect(res[2].$value).toBe(3)
+    // normal keys
+    arr = [
+      { $key: 'a', $value: { v: 3 } },
+      { $key: 'c', $value: { v: 1 } },
+      { $key: 'b', $value: { v: 2 } }
+    ]
+    res = filter.call(vm, arr, '"v"')
+    expect(res[0].$value.v).toBe(1)
+    expect(res[1].$value.v).toBe(2)
+    expect(res[2].$value.v).toBe(3)
+  })
 })
 
 function assertNumberAndFalsy (filter) {