Заполнение выбора с помощью ряда времен в инкрементах, плюс дополнительные опции

Используя Ruby on Rails, я заполняю 'выбор' с помощью времен с помощью данного инкремента, такой как каждые 30 минут. В настоящее время я выписываю все возможности в файле YAML, но я чувствую, что существует дождевик путь. Я думаю, что хочу обеспечить start_time, end_time, инкремент и в настоящее время просто еще одна опция под названием 'Закрытый' (думайте 'business_hours'). Так, мой выбор мог бы отобразиться:

'Закрытый'

5:00

5:30

6:00

...

[полностью к]...

23:30

Кто-либо может думать о лучшем способе сделать это или просто 'записывает' их всех лучший способ?

5
задан John Topley 18 February 2010 в 07:41
поделиться

3 ответа

Этот ответ основан на ответе @emh.

def create_hours(parameters)
  start_time = parameters[:start_time] ? parameters[:start_time] : 0
  end_time = parameters[:end_time] ? parameters[:end_time] : 24.hours
  increment = parameters[:increment] ? parameters[:increment] : 30.minutes
  Array.new(1 + (end_time - start_time)/increment) do |i|
    (Time.now.midnight + (i*increment) + start_time).strftime("%I:%M %p")
  end
end

Вы можете использовать это следующим образом:

create_hours(:start_time => 5.hours, :end_time => 23.hours)
=> ["05:30 AM", "06:00 AM", "06:30 AM", "07:00 AM", "07:30 AM", "08:00 AM", 
    "08:30 AM", "09:00 AM", "09:30 AM", "10:00 AM", "10:30 AM", "11:00 AM", 
    "11:30 AM", "12:00 PM", "12:30 PM", "01:00 PM", "01:30 PM", "02:00 PM", 
    "02:30 PM", "03:00 PM", "03:30 PM", "04:00 PM", "04:30 PM", "05:00 PM", 
    "05:30 PM", "06:00 PM", "06:30 PM", "07:00 PM", "07:30 PM", "08:00 PM", 
    "08:30 PM", "09:00 PM", "09:30 PM", "10:00 PM", "10:30 PM", "11:00 PM"]

Чтобы добавить «Закрытый», используйте:

["closed"] + create_hours(:start_time => 5.hours, :end_time => 23.hours)

Вы также можете передать : increment => 15.minutes - по умолчанию он установлен на 30 минут .

13
ответ дан 18 December 2019 в 07:29
поделиться
["closed"] + Array.new(24.hours / 30.minutes) do |i|
  (Time.now.midnight + (i*30.minutes)).strftime("%I:%M %p")
end
8
ответ дан 18 December 2019 в 07:29
поделиться

Мне удалось установить (более раннюю версию) SDK на компьютере с ОС Windows, а затем скопировать соответствующие библиотеки в среду разработки Linux. Я хотел бы, чтобы солнце предоставило все JDK в формате zip/tar. Я ненавижу установку программного обеспечения только для того, чтобы получить файлы .jar из архива. Следует отметить, что SDK включает в себя эмулятор мобильного устройства, который не работает под Linux, но для компиляции кода нужен только .jars.

-121--4903732-

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

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

Я использую перечисление ListButtons в модели представления, чтобы представить кнопки в списке, и я использую свойство Тэгов каждой кнопки, чтобы передать последовательности значение перечисления для этой кнопки. Свойство ListBox.SelectedStartPath позволяет указать свойство Тэгов в качестве источника для выбранного значения, которое связывается с моделью представления с помощью свойства SelectedValue . Я думал, что мне понадобится конвертер значений для преобразования между последовательностью и его значением перечисления, но встроенные конвертеры WPF справились с преобразованием без проблем.

Вот полная разметка для Window1.xaml :

<Window x:Class="RadioButtonMvvmDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <!-- Resources -->
    <Window.Resources>
        <Style x:Key="RadioButtonList" TargetType="{x:Type ListBox}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="ItemContainerStyle">
                <Setter.Value>
                    <Style TargetType="{x:Type ListBoxItem}" >
                        <Setter Property="Margin" Value="5" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                    <Border BorderThickness="0" Background="Transparent">
                                        <RadioButton 
                                            Focusable="False"
                                            IsHitTestVisible="False"
                                            IsChecked="{TemplateBinding IsSelected}">
                                            <ContentPresenter />
                                        </RadioButton>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBox}">
                        <Border BorderThickness="0" Padding="0" BorderBrush="Transparent" Background="Transparent" Name="Bd" SnapsToDevicePixels="True">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <!-- Layout -->
    <Grid>
        <!-- Note that we use SelectedValue, instead of SelectedItem. This allows us 
        to specify the property to take the value from, using SelectedValuePath. -->

        <ListBox Style="{StaticResource RadioButtonList}" SelectedValuePath="Tag" SelectedValue="{Binding Path=SelectedButton}">
            <ListBoxItem Tag="ButtonA">Button A</ListBoxItem>
            <ListBoxItem Tag="ButtonB">Button B</ListBoxItem>
        </ListBox>
    </Grid>
</Window>

Модель представления имеет единственное свойство SelectedButton, которое использует перечисление ListButtons для отображения выбранной кнопки. Свойство вызывает событие в базовом классе, который я использую для моделей просмотра, которое вызывает событие PropertyChanged :

namespace RadioButtonMvvmDemo
{
    public enum ListButtons {ButtonA, ButtonB}

    public class Window1ViewModel : ViewModelBase
    {
        private ListButtons p_SelectedButton;

        public Window1ViewModel()
        {
            SelectedButton = ListButtons.ButtonB;
        }

        /// <summary>
        /// The button selected by the user.
        /// </summary>
        public ListButtons SelectedButton
        {
            get { return p_SelectedButton; }

            set
            {
                p_SelectedButton = value;
                base.RaisePropertyChangedEvent("SelectedButton");
            }
        }

    }
} 

В производственном приложении установщик SelectedButton вызовет метод класса обслуживания, который выполнит действие, требуемое при выборе кнопки.

И чтобы быть полным, вот базовый класс:

using System.ComponentModel;

namespace RadioButtonMvvmDemo
{
    public abstract class ViewModelBase : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Protected Methods

        /// <summary>
        /// Raises the PropertyChanged event.
        /// </summary>
        /// <param name="propertyName">The name of the changed property.</param>
        protected void RaisePropertyChangedEvent(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
                PropertyChanged(this, e);
            }
        }

        #endregion
    }
}

Надежда, которая помогает!

-121--962293-

Вместо < select > можно использовать тип ввода HTML5 time :

<input type='time' min='05:30' max='23:30' step='00:30' />

Поскольку ввод time доступен только в HTML5 (на данный момент его поддерживает только Opera). Я задал вопрос о том, чтобы сделать то же самое для элемента < input type = 'range' > .

0
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: