2016-08-18 74 views
0

我有一个功能,但我想知道是否有更好的方法来做到这一点。写回退选择器的更好方法是什么?

我有5种尺寸,我试图获得当前尺寸的缩放级别。如果当前尺寸未指定尺寸,我想检查其他较小尺寸以查看是否有指定要使用的尺寸。

也就是说,如果没有指定XL变焦,检查是有一个LG使用,如果没有,检查是否有一个MD大小等

目前,我有一个很大的switch有一堆if/else声明。任何更干净的方式来做到这一点,我错过了?

self.updateZoom = function() { 
    var defaultZoomLevel = 8; 

    switch(self.getSize()) { 
    case 'xs': 
    if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'sm': 
    if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'md': 
    if (self.mdZoom) { 
     self.zoom = self.mdZoom; 
    } else if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'lg': 
    if (self.lgZoom) { 
     self.zoom = self.lgZoom; 
    } else if (self.mdZoom) { 
     self.zoom = self.mdZoom; 
    } else if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'xl': 
    if (self.xlZoom) { 
     self.zoom = self.xlZoom; 
    } else if (self.lgZoom) { 
     self.zoom = self.lgZoom; 
    } else if (self.mdZoom) { 
     self.zoom = self.mdZoom; 
    } else if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    default: 
    self.zoom = defaultZoomLevel; 
    } 

    self.zoom = parseInt(self.zoom); 
} 
+0

而不是开关,你可以只使用case xl。就我所知,这会导致与开关盒相同的缩放级别。 –

+0

'self.zoom = self.xsZoom || defaultZoomLevel;' – dandavis

回答

1

我们称之为“渐进增强”:

我们先从最小,并继续,直到我们达到规模由self.getSize()

['xs', 'sm', 'md', 'lg', 'xl'].forEach(function(size){ 
    if(self[size + 'Zoom']){ 
     self.zoom = self[size + 'Zoom']; 
    } 

    if(size == self.getSize()){ 
     return false; 
    } 
}); 

编辑返回:因为没有办法突破内内置forEach你可以试试ES6的方式:

['xs', 'sm', 'md', 'lg', 'xl'].some(function(size){ 
    if(self[size + 'Zoom']){ 
     self.zoom = self[size + 'Zoom']; 
    } 

    return size == self.getSize(); 
}); 

or @Glufu's回答

+1

你为什么返回false? –

+0

返回false意味着jQuery for each-loop – Marcus

+0

中的“break”并返回true不会中断? –

1

其他的方式的@pwolaq的版本,用纯JS:

// init variables 
var steps = ['xl', 'lg', 'md', 'sm', 'xs']; 
var i = steps.indexOf(self.getSize()); 

// check borders 
i = (i == -1) ? steps.length-1 : i; 
// set default zoom 
self.zoom = self.xsZoom; 

// "search" best zoom 
for(; i<steps.length; i++){ 
    if(self[steps[i] + 'Zoom']){ 
    self.zoom = self[steps[i]+'Zoom']; 
    break; 
    } 
} 

如果self.getSize()'lg',它会尝试先self.lgZoom。如果它不成功,它会尝试self.mdZoom,然后self.smZoom等等。

+0

indexOf返回-1怎么样? – pwolaq

+0

你的权利我修好了 – Marcus

+0

你应该检查条件在进入循环之前 - 这种方式将在每次迭代时检查,更不用说它不会将缩放设置为defaultZoomLevel变量值 – pwolaq