给定一个产品列表页面,其中一些过滤器 ( query
, status
, page
, perPage
) 不能一起使用:
- 当用户写入 a
query
时,status
应清除过滤器,并将其page
设置为 1。 - 当用户选择一个
status
过滤器时,query
过滤器应该被清除,并page
设置为 1。 - 当用户更改 时
perPage
,page
设置为 1(其他过滤器保持原样) - 当用户更改 时
page
,过滤器保持原样。
这是我尝试实现它的方法:
App.ProductsController = Ember.ArrayController.extend({
query: null,
status: null,
page: 1,
perPage: 15,
queryDidChange: function() {
this.setProperties({
status: null,
page: 1
});
}.observes('query'),
statusDidChange: function() {
this.setProperties({
query: null,
page: 1
});
}.observes('status'),
perPageDidChange: function() {
this.set('page', 1);
}.observes('perPage'),
parametersDidChange: function() {
this.send('reloadModel');
}.observes('query', 'status', 'page', 'perPage'),
actions: {
reloadModel: function() {
// code omitted which makes API call using all filters set
}
}
});
但是当发生query
变化时,queryDidChange
观察者会被调用,这会清除status
. 随着status
改变,statusDidChange
观察者被调用,这将清除query
等。
这种解决方案可能不是最好的,但我想保留一种“Ember 方式”来做到这一点,并且只使用公共 API(例如 not _suspendObservers
)。
我怎么能做到这一点?也许在某处使用运行循环?
编辑
另请注意,我知道视图可以发送操作而不仅仅是更改属性,因此控制器将如下所示:
App.ProductsController = Ember.ArrayController.extend({
actions: {
queryDidChange: function() {
this.setProperties({
status: null,
page: 1
});
this.send('reloadModel');
},
// code omitted
}
});
但是这个解决方案似乎有点冗长,并且不使用观察者和绑定能力,所以我希望有一种方法可以更好地做到这一点。