2015-08-19 2 views
0

Я пытаюсь создать поле даты MV с помощью выбора даты. Ближайшим, что я смог получить, является использование выбора даты, чтобы сохранить дату в viewScope, затем кнопку Добавить дату в существующее поле «Дата МВ». Он работает (вроде), но кажется, что это очень неудобный способ сделать это. Некоторые искали и не могли найти ничего лучше. Поле, в котором хранятся значения, должно быть доступно для редактирования, чтобы при необходимости можно было удалить значение, но не было гладким. Любые идеи?Создайте многозначное поле даты с помощью datepicker

Редактировать 21 авг 2015 Принимал участие в ответе Павла и части моего решения, но у меня возникли проблемы с набором данных. См. Код ниже - так как он работает нормально и сохраняет список дат в viewScope.vsDates. Если вы удалите // и добавили в строку viewScope.vsNames = tArray; // закомментируем эту строку и запустим тот же процесс, что она не сработает в строке tArray.push (addDate) с сообщением об ошибке «Ошибка при добавлении даты Ошибка вызова метода push (java.util.Date)» на объект типа ' Date [JavaScript Object] '" Так что, как только я вернусь к значениям из WFSMainDoc.getValue (" ExpPayDate "), тип данных изменился, но не уверен, как обойти эту часть.

<xp:panel id="panelAddDates"> 
     Additional Display Dates : 
     <xp:table> 
      <xp:tr> 
       <xp:td valign="top"> 

        <xp:inputText id="AddDate" value="#{viewScope.vsAddDate}"> 
         <xp:dateTimeHelper id="dateTimeHelper3"></xp:dateTimeHelper> 
         <xp:this.converter> 
          <xp:convertDateTime type="date" dateStyle="medium"> 
          </xp:convertDateTime> 
         </xp:this.converter> 
        </xp:inputText> 
       </xp:td> 
       <xp:td valign="top"> 
        <xp:button value="Add to list" id="button2"> 
         <xp:eventHandler event="onclick" submit="true" 
          refreshMode="partial" refreshId="panelAddDates"> 
          <xp:this.action><![CDATA[#{javascript:try{ 
print("Start Transfer date"); 
var addDate:NotesDateTime = viewScope.vsAddDate; 
print("Got addDate " + addDate); 
//var expPayDate = WFSMainDoc.getValue("ExpPayDate"); 
var expPayDate = viewScope.vsDates; 
    if (addDate != null){ 
     if (expPayDate == null || expPayDate == ""){ 
      print("expPayDate is null") 
      var tArray:Array = new Array; 
      tArray.push(addDate); 
      //WFSMainDoc.setValue("ExpPayDate" , tArray) 
      viewScope.vsDates = tArray 
      print("ExpPayDate in WFSMainDoc = " + WFSMainDoc.getValue("ExpPayDate")) 
      print("ExpPayDate in viewscope = " + viewScope.vsDates) 
     }else{ 
      var tArray:Array = new Array; 
      //tArray = WFSMainDoc.getValue("ExpPayDate"); 
      tArray = viewScope.vsDates; 
      print("Got tArray = " + tArray.toString()); 
      tArray.push(addDate); 
      //WFSMainDoc.setValue("ExpPayDate" , tArray); 
      viewScope.vsNames = tArray; //comment out this line 
      //print("ExpPayDate in WFSMainDoc = " + WFSMainDoc.getValue("ExpPayDate")); 
      print("ExpPayDate in viewScope = " + viewScope.vsDates); 
     } 
     viewScope.remove("vsAddDate") 
     print("Done") 
    } 
}catch(e){ 
    print("Error in Add Date " + e.toString()) 
}}]]></xp:this.action> 
         </xp:eventHandler> 
        </xp:button> 
       </xp:td> 
       <xp:td valign="top"> 

       <xe:djextListTextBox id="djextListTextBox1" 
        value="#{WFSMainDoc.ExpPayDate}" multipleSeparator=";"> 
       </xe:djextListTextBox> 
       </xp:td> 
      </xp:tr> 
     </xp:table> 
     </xp:panel><!-- panelAddDates --> 

ответ

0

после намного большего времени, чем следовало бы, я разработал очень работоспособное решение. У меня есть сборщик данных, привязанный к requestScope.addDate, затем кнопка добавления, которая сохраняет выбранное значение в viewScope.vsDates как массив дат. Также кнопка добавления устанавливает данные бэкэнда в viewScope.vsDates. Затем добавьте элемент управления повтора, который заполнен viewScope.vsДата, элемент управления повтора отображает кнопку и значение даты для каждого экземпляра в viewScope. Кнопка на повторе отображается только в том случае, если документ доступен для редактирования, кнопка знает позицию элемента, который должен быть удален, поэтому он удаляет его из viewScope и сбрасывает бэкэнд-поле. См. Изображение ниже.

enter image description here

0

Как насчет нормального DatePicker, связанного с переменной requestScope, которая имеет событие ONBLUR добавить поле в поле DataSource, освежающий в соответствующий компонент (см следующее предложение)? Затем привяжите поле источника данных к текстовому блоку списка Dojo List (помня, чтобы установить его в многозначное значение), чтобы пользователи могли удалять значения, но избегая необходимости обрабатывать проверку нескольких значений?

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

+0

Павел, видеть мои изменения к первоначальному вопросу выше. Кажется, я сталкиваюсь с проблемой типа данных, но не уверен, как ее решить. –

+0

getValue(), вероятно, получает оболочку SSJS - очевидно, использование DateTime небезопасно. getItemValueDate() может быть тем, что вам нужно. –

+0

Используется повторный контроль, а не текстовый список dojo, который я не мог получить. –

0

Можете ли вы разделить значения поля на несколько временных полей одного значения?