我正在尝试使用 Aurelia 中重复绑定上的值转换器对 Map 进行排序:
原始代码:
<div repeat.for="[id, obj] of myMap">
${obj.SomeProperty}
</div>
这按预期工作,显示地图的值,当我向地图添加一些东西时,它也会被添加。
然后我创建了以下值转换器:
export class SortValueConverter {
toView(map, propertyName, direction) {
const factor = direction === 'desc' ? -1 : 1;
return new Map([...map.entries()].sort((a, b) => (a[propertyName] - b[propertyName]) * factor));
}
}
<div repeat.for="[id, obj] of myMap | sort:'SomeProperty':'desc'">
${obj.SomeProperty}
</div>
这些值被正确地传递给值转换器,并且返回值确实是一个新映射。但是,重复绑定被破坏,UI 中没有显示任何内容。
我也尝试了不同的方法:
在将映射传递给值转换器之前将其转换为数组,然后使用常规数组值转换器:
export class SortValueConverter { toView(array, propertyName, direction) { const factor = direction === 'desc' ? -1 : 1; return array.sort((a, b) => (a[propertyName] - b[propertyName]) * factor)); } } <div repeat.for="obj of Array.from(myMap.values()) | sort:'SomeProperty':'desc'"> ${obj.SomeProperty} </div> // or alternatively: <div repeat.for="obj of [...myMap.values()] | sort:'SomeProperty':'desc'"> ${obj.SomeProperty} </div>
这给了我一个undefined
作为值转换器中的第一个参数。
接受一个 Map 作为值转换器的第一个参数,但返回一个数组:
export class SortValueConverter { toView(map, propertyName, direction) { const factor = direction === 'desc' ? -1 : 1; return [...map.values()].sort((a, b) => (a[propertyName] - b[propertyName]) * factor)); } } <div repeat.for="obj of myMap | sort:'SomeProperty':'desc'"> ${obj.SomeProperty} </div>
结果与我的第一个示例相同:正确返回了数组,但没有显示任何内容。
如何创建一个值转换器来对重复绑定的 Map 进行排序?