gpt4 book ai didi

ember.js - 设置 "arrangedContent"时,ArrayController 的 "sortAscending"并不总是更新

转载 作者:行者123 更新时间:2023-12-02 06:04:22 26 4
gpt4 key购买 nike

我正在尝试使用一个 HTML 选择标记在 Ember.ArrayController 子类中设置动态排序,如下所示:

App.ListController = Ember.ArrayController.extend
sortOptions: [{id: 0, text: 'Price High-Low', sortBy: 'pricing', sortAsc: false},
{id: 1, text: 'Price Low-High', sortBy: 'pricing', sortAsc: true},
{id: 2, text: 'Name Ascending', sortBy: 'name', sortAsc: true},
{id: 3, text: 'Name Descending', sortBy: 'name', sortAsc: false}]
currentSortOptionId: 0

sortBy: (->
this.get('sortOptions')[this.get('currentSortOptionId')].sortBy
).property('currentSortOptionId')

# Override
sortProperties: (->
[this.get('sortBy')]
).property('sortBy')

# Override
sortAscending: (->
this.get('sortOptions')[this.get('currentSortOptionId')].sortAsc
).property('currentSortOptionId')

在我的模板中,我有:
Sort by {{view Ember.Select content=sortOptions
optionValuePath="content.id"
optionLabelPath="content.text"
value=currentSortOptionId}}

{{#each listing in controller.arrangeContent}}
...
{{/each}}

更改选择器大部分时间都有效,并且始终适用于切换排序属性。但是,排序方向(通过“sortAscending”)属性会变得困惑,并且似乎有时会落后一个 Action (即,使用先前为“sortAscending”选择的值)。

这里会发生什么?

编辑:这是一个孤立示例的 JSFiddle: http://jsfiddle.net/s9AFr/3/

如果您多次更改排序选择器,您可以说服自己有时排序不正确,尤其是在涉及排序的升序/降序功能时。排序似乎“落后”于用户的选择。

最佳答案

不幸的是,我认为这是由于 bug .

为什么会发生

基本上现在发生的事情是 Ember 不希望 sortProperties 和 sortAscending 同时改变。在 SortableMixin 的 sortAscendingWillChange观察者,我们跟踪 sortAscending 的旧值(将其存储在 _lastSortAscending 中),然后,在后面的观察者中,如果 sortAscending确实,他们只是flip the arrangedContent array :

sortAscendingDidChange: Ember.observer('sortAscending', function() {
if (get(this, 'sortAscending') !== this._lastSortAscending) {
var arrangedContent = get(this, 'arrangedContent');
arrangedContent.reverseObjects();
}
}),

设置 sortAscending 时出现问题和 sortProperties同时,作为 sortAscendingWillChange在观察者触发之前,保留旧的 sortAscending 属性,然后因为 sortProperties更改后,数组将使用 sortAscending 的新值重新排序(所以在这一点上,一切都按照你的预期排序)......但最后是 sortAscendingDidChange观察者触发,看到 sortAscending 不同,所以它再次翻转整个数组。

编辑:变通( JSfiddle)

鉴于此错误的原因,我认为解决方法是确保 sortAscendingsortProperties不要同时改变。

所以不要制作 sortAscending一个计算属性,我们可以将它设置在观察 currentSortOptionId 的观察者中,注意在下一个运行循环中设置它(所以我们使用 Ember.run.later )。这样, sortProperties计算属性将首先更改,内容将被排序,然后是 sortAscending属性将在之后设置。

关于ember.js - 设置 "arrangedContent"时,ArrayController 的 "sortAscending"并不总是更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21412453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com