Опция автоматического выбора ColdFusion - PullRequest
3 голосов
/ 16 апреля 2009

Каков наилучший способ автоматической установки выбранного элемента для элемента select / option на post-back? Вот как мы сейчас это делаем:

<select id="grade" name="grade">
  <option value="A"<cfif form.grade = 'A'> selected="selected"</cfif>>A</option>
  <option value="B"<cfif form.grade = 'B'> selected="selected"</cfif>>B</option> 
  <option value="C"<cfif form.grade = 'C'> selected="selected"</cfif>>C</option> 
  <option value="D"<cfif form.grade = 'D'> selected="selected"</cfif>>D</option> 
  <option value="F"<cfif form.grade = 'F'> selected="selected"</cfif>>F</option>
</select>

Есть ли более чистый или простой способ сделать это с ColdFusion? Заранее спасибо!

Ответы [ 8 ]

3 голосов
/ 17 апреля 2009

На мой взгляд, один из лучших способов - использовать CFSelect:

<cfquery name="getGrades" datasource="#application.dsn#">
  select gradeLetter from Grades
</cfquery>

<cfselect
  name="grade"
  query="getGrades"
  display="gradeLetter"
  value="gradeLetter"
  selected="#form.grade#" />
2 голосов
/ 16 апреля 2009

Вы также можете сделать это с массивом структур.

<cfparam name="form.grade" default="C">
<cfset mydata = [{grade="A",value="A"},{grade="B",value="B"},{grade="C",value="C"},{grade="D",value="D"},{grade="F",value="F"}]>
<cfoutput>
<select id="grade" name="grade">
    <cfloop array="#mydata#" index="i">
        <option value="#i['value']#"<cfif form.grade EQ i['grade']> selected="selected"</cfif>>#i['value']#</option>
    </cfloop>
</select>
</cfoutput>
2 голосов
/ 16 апреля 2009

Как это:

<cfsavecontent variable="GradeOptions">
A:A
B:B
C:C
D:D
F:F
</cfsavecontent>

<select id="grade" name="grade">
    <cfloop index="CurOpt" list="#trim(GradeOptions)#" delimiters="#Chr(10)#">
        <option value="#ListFirst(CurOpt,':')#"<cfif form.grade EQ ListFirst(CurOpt,':')> selected="selected"</cfif>>#ListRest(CurOpt,':')#</option>
    </cfloop>
</select>


Это предполагает, что у вас всегда есть отдельное значение: информация метки - если ваше значение и метка всегда одинаковы, вы можете сделать это:

<cfsavecontent variable="GradeOptions">
A
B
C
D
F
</cfsavecontent>

<select id="grade" name="grade">
    <cfloop index="CurOpt" list="#trim(GradeOptions)#" delimiters="#Chr(10)#">
        <option<cfif form.grade EQ CurOpt> selected="selected"</cfif>>#CurOpt#</option>
    </cfloop>
</select>
1 голос
/ 17 апреля 2009

с использованием cfscript с функциями

<cfscript>
Function setSelected(val1, val2){
    if (val1 EQ val2)
    {
        Return 'selected="selected"';
    } 
    else 
    {
        Return '';
    }
}
</cfscript>
<select id="grade" name="grade">
  <option value="A" #setSelected('A', form.grade)#>A</option>
  <option value="B" #setSelected('B', form.grade)#>B</option> 
  <option value="C" #setSelected('C', form.grade)#>C</option> 
  <option value="D" #setSelected('D', form.grade)#>D</option> 
  <option value="F" #setSelected('F', form.grade)#>F</option>
</select>
0 голосов
/ 17 апреля 2009

Честно говоря, я не вижу, как что-то из этого лучше, чем исправленная версия вашего первого прохода (ниже)

   <select id="grade" name="grade">
      <option value="A"<cfif form.grade EQ "A"> selected </cfif> >A</option>
      <option value="B"<cfif form.grade EQ "B"> selected </cfif> >B</option> 
      <option value="C"<cfif form.grade EQ "C"> selected </cfif> >C</option> 
      <option value="D"<cfif form.grade EQ "D"> selected </cfif> >D</option> 
      <option value="F"<cfif form.grade EQ "F"> selected </cfif> >F</option>
   </select>

Это просто, чисто и понятно.

Если вы просто чувствуете необходимость быть более ловким и собираетесь делать много манипуляций с пользовательским интерфейсом, потратьте некоторое время на jQuery. Изучите Рэй Камден jQuery и CF Posts и Бена Наделя Javascript и CF Posts , и скоро это будет второй натурой ...

<script type="text/javascript">                                         
  jQuery(document).ready(function() {
     $("#grade option[value='<CFOUTPUT>#FORM.Grade#</CFOUTPUT>']")
      .attr('selected', 'selected');
  });
</script>

<select id="grade" name="grade">
  <option value="A">A</option>
  <option value="B">B</option> 
  <option value="C">C</option> 
  <option value="D">D</option> 
  <option value="F">F</option>
</select>

Конечно, это выглядит более странно, чем некоторые другие варианты здесь, но удивительно мощно решает проблемы, которые CF не очень хорошо, как только вы изучите это (поверьте мне, это быстро обретет смысл, и вы будете удивляться, как вы это сделали код пользовательского интерфейса без него).

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

0 голосов
/ 17 апреля 2009

Чтобы расширить мой другой ответ, вам следует правильно отделить ваши данные от интерфейса, сохранить оценки в базе данных и использовать код, подобный следующему:

<cfset GradeOptions = Grades.readAvailable() />

<select id="grade" name="grade">
    <cfloop query="GradeOptions">
        <option value="#GradeCode#"
            <cfif Form.Grade EQ GradeCode>selected="selected</cfif>
            >#GradeCode# - #GradeDesc#</option>
    </cfloop>
</select>

(Опять же, если оценки должны обрабатываться только как одна буква, значения можно указывать в виде простого списка / массива, а не запроса.)

Ключевым моментом является то, что вы можете изменить свою структуру оценок, не меняя интерфейс, а также обновление интерфейса не требует, чтобы вы знали, какие оценки.

0 голосов
/ 17 апреля 2009

Знаете, это может быть непопулярно, но решение, которое вы изначально изложили в этом вопросе, является лучшим.

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

Иногда нужно просто надеть перчатки

http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx

0 голосов
/ 16 апреля 2009

Как насчет этого?

<cfparam name="form.grade" default="A">
<cfoutput>
<select id="grade" name="grade">
<cfloop index="code" from="65" to="90">
    <option value="#Chr(code)#"<cfif form.grade EQ Chr(code)> selected="selected"</cfif>>#Chr(code)#</option>
</cfloop>
</select>
</cfoutput>

Немного сложно, ага:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...