Как сделать вычисляемое поле как вычисленным, так и привязанным к полю?

Я знаю, как привязать вычисляемое поле к полю документа. И я знаю, как использовать JavaScript для вычисления вычисляемого поля. Но как мне сделать оба?

Скажи, что мой javascript в вычисляемом поле:

 @Name("[ABBREVIATE]" ,@UserName());

Как мне связать это с полем document1.ReqName?

5 ответов

Решение

Для значения вычисляемого поля используйте расширенную привязку данных и выберите язык выражений (EL). Используемое выражение - просто "document1.ReqName" (без кавычек).

Я использую два поля:

  1. скрытое поле ввода, которое вычисляет требуемое значение (используя элемент управления xp:inputHidden). Я использую "значение по умолчанию" для эмуляции Computed при компоновке - и конвертеры для эмуляции Computed ( вдохновлено Томми Валандом).
  2. видимое вычисляемое поле или видимое поле ввода, предназначенное только для чтения, которое выполняет те же вычисления. Возможно, это можно изменить, чтобы отобразить значение скрытого поля ввода, используя getComponent(""). GetValue()?

Может быть, я упускаю суть, но почему бы тебе просто не сделать следующее?

<xp:inputText id="inputText1" value="#{document1.Reader}">
    <xp:this.defaultValue>
        <![CDATA[#{javascript:@Name("[ABBREVIATE]",@UserName());}]]>
    </xp:this.defaultValue>
</xp:inputText>

Это текстовое поле, привязанное к EL для DocumentField. Если поле пустое, оно рассчитывается по значению по умолчанию.

Большой! - Я упустил суть. Но вы можете попробовать это:

<xp:text escape="true" id="computedField3">
    <xp:this.value>
        <![CDATA[#{javascript: 
                    if(@IsNewDoc()){
                          document1.replaceItemValue("Reader",@Name("[ABBREVIATE]",@UserName()));
                    }
                    return document1.getItemValue("Reader");}]]>
    </xp:this.value>
</xp:text>
<xp:text escape="true" id="computedFieldTest1">
[CDATA[#{javascript:
  var userName = "Username: "+("Reader",@Name("[ABBREVIATE]",@UserName()));
  currentDocument.replaceItemValue("computedFieldTest1",userName);
  return userName;
  }]]></xp:this.value>
</xp:text>

Я бы не связывал в этом случае. Я бы связал любой другой элемент управления и в этом случае вручную добавил бы это в поле документа непосредственно со скриптом перед действием сохранения.

так что-то вроде: (простите код не на моем рабочем компе)

<eventhandler>
   <actionGroup>
      <script><![CDATA[#{javascript:
         doc.replaceItemValue("ReqName", @Name("[ABBREVIATE]" ,@UserName()));
      }]]><script>

      <saveDocument></saveDocument>
   </actionGroup>
</eventhandler>
Другие вопросы по тегам