Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 寻找一个余烬的方式来处理过滤_Ember.js_Observers - Fatal编程技术网

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