Skip to content

Commit fdfac33

Browse files
committed
fix vuejs#721 support sorting by and in orderBy filter
1 parent 76dbdc7 commit fdfac33

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

src/directives/repeat.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,13 @@ module.exports = {
176176
// instance.
177177
for (i = 0, l = data.length; i < l; i++) {
178178
obj = data[i]
179-
raw = converted ? obj.value : obj
179+
raw = converted ? obj.$value : obj
180180
vm = !init && this.getVm(raw)
181181
if (vm) { // reusable instance
182182
vm._reused = true
183183
vm.$index = i // update $index
184184
if (converted) {
185-
vm.$key = obj.key // update $key
185+
vm.$key = obj.$key // update $key
186186
}
187187
if (idKey) { // swap track by id data
188188
if (alias) {
@@ -264,9 +264,9 @@ module.exports = {
264264
var original = data
265265
var meta = { $index: index }
266266
if (this.converted) {
267-
meta.$key = original.key
267+
meta.$key = original.$key
268268
}
269-
var raw = this.converted ? data.value : data
269+
var raw = this.converted ? data.$value : data
270270
var alias = this.arg
271271
var hasAlias = !isObject(raw) || !isPlainObject(data) || alias
272272
// wrap the raw data with alias
@@ -478,8 +478,8 @@ function objToArray (obj) {
478478
while (i--) {
479479
key = keys[i]
480480
res[i] = {
481-
key: key,
482-
value: obj[key]
481+
$key: key,
482+
$value: obj[key]
483483
}
484484
}
485485
// `this` points to the repeat directive instance

src/filters/array-filters.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ exports.orderBy = function (arr, sortKey, reverseKey) {
6161
}
6262
// sort on a copy to avoid mutating original array
6363
return arr.slice().sort(function (a, b) {
64-
a = Path.get(a, key)
65-
b = Path.get(b, key)
64+
a = _.isObject(a) ? Path.get(a, key) : a
65+
b = _.isObject(b) ? Path.get(b, key) : b
6666
return a === b ? 0 : a > b ? order : -order
6767
})
6868
}

test/unit/specs/directives/repeat_spec.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,38 @@ if (_.inBrowser) {
372372
}
373373
})
374374

375+
it('orderBy supporting $key for object repeaters', function (done) {
376+
var vm = new Vue({
377+
el: el,
378+
template: '<div v-repeat="obj | orderBy sortKey">{{$value}}</div>',
379+
data: {
380+
sortKey: '$key',
381+
obj: {
382+
c: 1,
383+
a: 3,
384+
b: 2
385+
}
386+
}
387+
})
388+
expect(el.innerHTML).toBe('<div>3</div><div>2</div><div>1</div><!--v-repeat-->')
389+
vm.sortKey = '$value'
390+
_.nextTick(function () {
391+
expect(el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div><!--v-repeat-->')
392+
done()
393+
})
394+
})
395+
396+
it('orderBy supporting $value for primitive arrays', function () {
397+
var vm = new Vue({
398+
el: el,
399+
template: '<div v-repeat="list | orderBy \'$value\'">{{$value}}</div>',
400+
data: {
401+
list: [3, 2, 1]
402+
}
403+
})
404+
expect(el.innerHTML).toBe('<div>1</div><div>2</div><div>3</div><!--v-repeat-->')
405+
})
406+
375407
it('track by id', function (done) {
376408

377409
assertTrackBy('<div v-repeat="list" track-by="id">{{msg}}</div>', function () {

0 commit comments

Comments
 (0)