在foreach循环闭包内断开开关

时间:2014-11-24 17:23:45

标签: dart dart-polymer

我有以下代码

 void onSelectionChangedFiredSources( Event event, var detail,
                                SelectCheckboxMenuComponent target)
  {
    // getItemModels returns a list of objects
      getItemModels( target.selectedItems )
        ..forEach( (item)
          {          
             switch( item.label )
             {
               case 'Ear':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['ear-side-dialog']);
                 break;

               case 'Eye':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['eye-side-dialog']);
                 break;

               case 'Nostril':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['nostril-side-dialog']);
                 break;

               case 'Thorax':
                 toggleDialog( 'paper-dialog-transition-center',
                                $['thorax-side-dialog']);
                 break;

               default:
                 srcDataMap.add( item.label, item.selected);
             }   
          });
  }

当一个案例被触发时,我想打破foreach循环。

请注意,每次选择更改时,target.selectedItems表达式都会返回所有选择。所以,如果' Ear'是第一个选择,循环执行,当' Eye'然后选择列表返回将同时具有耳朵和眼睛。 这怎么做得最好? 感谢

1 个答案:

答案 0 :(得分:5)

您无法中断forEach来电。

您无法使用break,因为它不是循环。它是一个函数调用,break仅在当前函数内有效。

你不能return,因为这只会继续下一个元素。

可以 throw结束forEach,但这并不好看。

您可以做的是完全不使用forEach,而是使用for-in循环,然后使用标记的中断使用break

void onSelectionChangedFiredSources(Event event, var detail,
                                    SelectCheckboxMenuComponent target) {
  // getItemModels returns a list of objects
  var models = getItemModels(target.selectedItems);
  loop: for (var item in models) {
    switch (item.label) {
      case 'Ear':
      case 'Eye':
      case 'Nostril':
      case 'Thorax':
        toggleDialog('paper-dialog-transition-center',
                     $['${item.label.toLowerCase()}-side-dialog']);
        break loop;
      default:
        srcDataMap.add( item.label, item.selected);
    }   
  }
}

您需要使用带标签的break,因为如果没有标签,它只会破坏switch声明。