在Javascript

时间:2017-10-27 23:09:17

标签: javascript jquery callback object-literal

我有一个对象,它在我的页面上存储UI小部件的所有实例,其中一些在创建小部件时将回调作为选项传递。

Page.menu = Widget.sidePanel({
  trigger: "#menu-toggler",
  panel: "#menu-panel",
  onOpen: function(){
    Page.otherPanel.close();
    Page.yetAnother.close();
  }
}),

创建后,“onOpen”选项在“Page.menu.onOpen”存储/访问,并通过“open”方法调用,如:

this.open(){
  // ... panel opening stuff
  this.onOpen.apply();
}

我正在寻找一种从回调中添加/删除方法的方法。我想把回调方法设置为一个数组,但这需要用一个函数包装每个方法(否则如果方法尚未设置,JS会抱怨(例如,其中一个回调方法是关闭一个尚未设置的面板)创建))。

1 个答案:

答案 0 :(得分:1)

我会这样做:

Page.menu = Widget.sidePanel({
  onOpenHandlers: [],
  onOpen: function(){
    console.log('menu is going to be open');
    for(var i = 0; i < this.onOpenHandlers.length; i++) {
      this.onOpenHandlers[i]();
    }
  }
});

然后你需要填充该处理程序列表:

Page.menu.onOpenHandlers.push(Page.otherPanel.close);
Page.menu.onOpenHandlers.push(function() {
  console.log('yetAnother is being closed due to menu open');
  Page.yetAnother.close();
});

如果需要删除处理程序,可以为处理程序列表构建更复杂的结构:

[
  {
    id: 'some_unique_handler_id',
    run: function() { /* some handler logic */ }
  },
  //...
]

需要额外的电话:

for(var i = 0; i < this.onOpenHandlers.length; i++) {
  this.onOpenHandlers[i].run();
}

然后应该实现两个方法(在某个地方,在Page.utils甚至是全局):

function addHandler(list, id, run) {
  var found = list.find(function(item) { return item.id === id });
  if(found) { // just replace the callback
    found.run = run;
  }
  else {
    list.push({ id: id, run: run});
  }
}

function removeHandler(list, id) {
  var foundIndex = list.findIndex(function(item) { return item.id === id });
  if(foundIndex >= 0) {
    list.splice(foundIndex, 1);
  }
}

用法很明显:

addHandler(Page.menu.onOpenHandlers, "otherPanelId", Page.otherPanel.close);
addHandler(Page.menu.onOpenHandlers, "yetAnotherId", function() {
  console.log('yetAnother is being closed due to menu open');
  Page.yetAnother.close();
});

removeHandler(Page.menu.onOpenHandlers, "otherPanelId");

findfindIndex抱歉!只是为了让这种移植更简单。