2015-10-15 3 views
0

Я использую ExtJS, и я нахожу, что делаю много проверок, используя «магические» строки. Я хотел бы использовать какие-то перечисленияКак создать перечисление или где его хранить?

т.е.

Colors.Red, Colors.White

и т.д.

Поддерживает ли Extjs это, я использую версию 4.2.

Также, если мне нужно создать новый класс или что-то еще, то где будет подходящее место для этого?

я в настоящее время

/app 
    controller 
    store 
    models 
    views 
    etc 

Они не кажутся правильное расположение, как это специально для контроллеров, представлений, моделей, магазины ..

Где желательно место, чтобы создавать вещи которые не вписываются в вышесказанное?

ответ

2

Это можно сделать по-другому, и это только для того, чтобы дать вам некоторое вдохновение.

Что я сделал в своем приложении, это создание папки enums в моем app folder. В этой папке я помещаю все мои перечисления, которые я хочу использовать в своем приложении. Имейте в виду, что я использую alternateClassName и uppercase, чтобы сделать их более похожими на перечисление.

Просто перечисление:

Ext.define('MyApp.enums.Orientation', { 
    alternateClassName: ['ORIENTATION'], 

    statics: { 
     PORTRAITPRIMARY: 'portrait-primary', // The orientation is in the primary portrait mode. 
     PORTRAITSECONDARY: 'portrait-secondary', // The orientation is in the secondary portrait mode. 
     LANDSCAPEPRIMARY: 'landscape-primary', // The orientation is in the primary landscape mode. 
     LANDSCAPESECONDARY: 'landscape-secondary', // The orientation is in the secondary landscape mode. 
     PORTRAIT: 'portrait', // The orientation is either portrait-primary or portrait-secondary. 
     LANDSCAPE: 'landscape' // The orientation is either landscape-primary or landscape-secondary. 
    } 
}); 

я могу использовать его как это:

MyApp.util.CordovaPlugins.lockOrientation(ORIENTATION.LANDSCAPE); 

Где lockOrientation выглядит следующим образом:

/** 
* Lock the viewport in a certain orientation and disallow rotation using the cordova screen orientation plugin 
* See [github.com/gbenvenuti/cordova-plugin-screen-orientation](https://github.com/gbenvenuti/cordova-plugin-screen-orientation) 
* for more details. 
* 
* Usage: 
* MyApp.util.CordovaPlugins.lockOrientation(ORIENTATION.LANDSCAPE); 
* 
* Possible orientations: 
* ORIENTATION.PORTRAITPRIMARY 
* ORIENTATION.PORTRAITSECONDARY 
* ORIENTATION.LANDSCAPEPRIMARY 
* ORIENTATION.LANDSCAPESECONDARY 
* ORIENTATION.PORTRAIT 
* ORIENTATION.LANDSCAPE 
* 
* @param {Enum} orientation Value of type MyApp.enums.Orientation to orientate the view in the given orientation. 
*/ 
lockOrientation: function(orientation) { 
    if (ORIENTATION.hasOwnProperty(orientation.toUpperCase())) { 
     screen.lockOrientation(orientation); 
    } 
    else { 
     Ext.Logger.error('The given orientation is not prohibited.'); 
    } 
} 

Другой перечисление:

Ext.define('MyApp.enums.PositionError', { 
    alternateClassName: ['POSITIONERROR'], 

    statics: { 
     PERMISSION_DENIED: 1, 
     POSITION_UNAVAILABLE: 2, 
     TIMEOUT: 3 
    } 
}); 

Использование:

getGpsErrorTitleByErrorCode: function(errorCode) { 
    var title; 

    switch (errorCode) { 
     case POSITIONERROR.PERMISSION_DENIED: 
      title = 'PERMISSION_DENIED'; 
      break; 
     case POSITIONERROR.POSITION_UNAVAILABLE: 
      title = 'POSITION_UNAVAILABLE'; 
      break; 
     case POSITIONERROR.TIMEOUT: 
      title = 'TIMEOUT'; 
      break; 
     default: 
      title: 'UNKNOWN_ERROR'; 
      break; 
    } 

    return title; 
} 

Я добавить перечисления в мой uses массив в классе, где я использую перечисление:

Ext.define('MyApp.util.CordovaPlugins', { 
    uses: [ 
     'MyApp.enums.PositionError', 
     'MyApp.enums.Orientation' 
    ], 

    ... 
}); 

Или в requires массиве app.js, чтобы сделать их в глобальном масштабе:

Ext.application({ 
    name: 'MyApp', 

    requires: [ 
     'MyApp.enums.*' 
    ], 

    ... 
}); 
+0

Ницца, вдохновение получило :-) ... Да, что заставляет меня думать и начинать понимать мои варианты! Благодарю. – Martin

0

ExtJS - это всего лишь инфраструктура JavaScript, поэтому все, что вы можете сделать в JavaScript, вы можете сделать в Ext.

С точки зрения структуры папок это чисто личное предпочтение, за исключением их условностей для магазинов, моделей и т. Д., Как вы описали. я предлагаю использовать структуру, которая является достаточно общим, чтобы применить к нескольким проектам, так что вы можете перенести структуру, если это необходимо, или перемещать аспекты между проектами без необходимости втиснуть их.

С точки зрения вещей, как Colours.Red, снова вы можете сделать это с помощью обычной JS, так что, возможно, объект так:

var Colours = { 
    Black: "#000000", 
    White: "#FFFFFF" 
}; 

Чтобы сделать это в более Ext'y образом, вы смотреть на что-то вроде:

Ext.define('MyApp.model.Util', { 
    statics: { 
     Colours: { 
     Black: 1, 
     White: 2 
     } 
    } 
}); 
+0

Это не было особенно полезно. Да, я знаю, что я делаю это чистым способом javascript. Я нашел способ использования «требует» внутри application.js и «определения» класса и обозначение этого как singleton. – Martin

+0

Структура папок - это личное предпочтение, но я надеялся получить какой-то вклад от того, что делают другие. Это все. – Martin

+0

Если вы знаете способ создания одноэлементного или статического класса, чтобы избежать магических строк для вашего примера с цветом, и вы ищете субъективную рекомендацию относительно того, где хранить ваши служебные классы, я не уверен, что ответы были бы полезны. – dougajmcdonald

Смежные вопросы