Ember.js 寻找一个余烬的方式来处理过滤
给定一个产品列表页面,其中包含一些无法同时工作的筛选器(Ember.js 寻找一个余烬的方式来处理过滤,ember.js,observers,Ember.js,Observers,给定一个产品列表页面,其中包含一些无法同时工作的筛选器(查询,状态,页面,每页): 当用户编写查询时,应清除状态过滤器,并将页面设置为1 当用户选择状态过滤器时,应清除查询过滤器,并将页面设置为1 当用户更改每页的时,页的设置为1(其他过滤器保持原样) 当用户更改页面时,过滤器保持原样 下面是我如何尝试实现它的: App.ProductsController = Ember.ArrayController.extend({ query: null, status: null, p
查询
,状态
,页面
,每页
):
- 当用户编写
时,应清除查询
过滤器,并将状态
设置为1页面
- 当用户选择
过滤器时,应清除状态
过滤器,并将查询
设置为1页面
- 当用户更改每页的
时,
页的
设置为1(其他过滤器保持原样)
- 当用户更改
,过滤器保持原样页面时
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
}
}
});
但是当查询
更改时,将调用queryDidChange
观察者,以清除状态
。随着状态
的更改,将调用statusDidChange
观察者,以清除查询
,等等
这种解决方案可能不是最好的,但我想保持一种“余烬方式”来做到这一点,并且只使用公共API(例如not\u suspendobserver
)
我怎样才能做到这一点?也许在某处使用运行循环
编辑
还请注意,我知道视图可以发送操作,而不仅仅是更改属性,因此控制器将如下所示:
App.ProductsController = Ember.ArrayController.extend({
actions: {
queryDidChange: function() {
this.setProperties({
status: null,
page: 1
});
this.send('reloadModel');
},
// code omitted
}
});
但是这个解决方案似乎有点冗长,并且没有使用observer&binding功能,所以我希望有一种方法可以做得更好。我不知道如何在Ember中暂停观察器,但是yuo可以通过观察器函数中的条件来实现这一点
queryDidChange: function() {
if(this.get('query')){
this.setProperties({
status: null,
page: 1
});
}
}.observes('query'),
statusDidChange: function() {
if(this.get('status')){
this.setProperties({
query: null,
page: 1
});
}
}.observes('status'),
谢谢,但它不能适用于所有情况。例如,当
查询
更改时,页面
由其观察者设置为1
,因此调用参数idchange
两次(因为查询和页面都会更改)。即使我删除了参数idchange
观察者,只需执行this.send('reloadModel')代码>在每个观察者的末尾,它将不起作用:如果用户选择了一个状态
,询问第二个页面
,当他想清除状态
时,页面需要设置为1
。使用if(this.get('status'))
条件,页面将不会被清除,因为状态将为null