Find your people. Pick a challenge. Ship something real. The CreatorCon Hackathon is coming to the Community Pavilion for one epic night. Every skill level, every role welcome. Join us on May 5th and learn more here.

Jelly, Javascript and html <select>ions

tobrien
Kilo Guru

Hi,

I am trying to understand how to dynamically add to a <select> from elements created in the Jelly -- here's the basics of my endeavor ==>

Extremely Simple Example for a single entry (one ID, and one NAME) :: I can use this in my UI PAGE html

<g2:evaluate var="jvar_some_name">

var id = '123456';    

var name = 'tobtobtob';

//you may assume that the values were actually developed from some GlideRecord calls

</g2:evaluate>

<select>

<option value="$[id]">$[name]</option>

</select>

But suppose I need to add an "array of values" using a var id = [ ];   like so ...

<g2:evaluate var="jvar_some_name">

var id = [ ];    

var name = [ ];

for (var k9=0;k9<10;k9++) {

        id.push(k9);

        name.push(k9.toString());

}

</g2:evaluate>

Trying to add the array contents as 'options' seems to be difficult for me. Below is one of many attempts ==>

I know this fails for a variety of reasons not the least which is:

        (a) Mixing the <option> line between the <g2:evaluate> of the for loop is just nuts.

        (b) the doubling of the square brackets doesn't get past the compiler.

<select>

<g2:evaluate>

for (var k9=0;k9<10;k9++) {

        </g2:evaluate>

          <option value="$[id[k9]]"> $[name[k9]] </option>

<g2:evaluate>

}

</g2:evaluate>

</select>

Any assistance you can offer would be greatly appreciated.

1 ACCEPTED SOLUTION

mike_allgire
Giga Guru

When ever writing Jelly in a UI Page, I frequent the two pages often. I would keep them handy. In addition, there are other available jelly tags, that they don't provide, but you can "discover" after trial and error.



http://wiki.servicenow.com/index.php?title=Jelly_Tags#gsc.tab=0


Extensions to Jelly Syntax - ServiceNow Wiki



The first question would be; what are you getting the user ID/name from? Is it from the user table or from another query of values from a different table. If it is a direct look up, you can use the extension for Extensions to Jelly Syntax - UI Reference. This will allow you to use a similar reference look up (like a reference field). If you are querying information from a list of user values created from other table(s), then you would want to use the Jelly Tags - While   jelly tag to loop through. In jelly, there isn't a "for" to be used directly in the contents of the scripting (Edit: or listen to ctomasi who knows more than I).



Below is an example of a bootstrap carousel that I created to reference some images from the db_image table.


<?xml version="1.0" encoding="utf-8" ?>


<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">


      <!--Query the image table to look for images that are active and start with 'test_slide'-->


<!--Retrieve the images in descending order by created date-->


      <g:evaluate var="jvar_gr" object="true">


              var gr = new GlideRecord('db_image');


              gr.addQuery('active',true);


              gr.addQuery('name','STARTSWITH','test_slide');


              gr.orderByDesc('sys_created_on');


              gr.query();


              gr;


      </g:evaluate>


<div id="myCarousel" class="carousel slide" data-ride="carousel">


  <!-- Wrapper for slides -->


  <div class="carousel-inner" role="listbox">


          <div class="item active">


                      <center><img src="main_slide_0.png" alt="Main"/></center>


              </div>


<!--Using Jelly while test, loop through the retrieved images and display them in the carousel-->


          <j:while test="${jvar_gr.next()}">


              <div class="item">


                      <center><img src="${gr.name}" alt="TEST"/></center>


              </div>


          </j:while>


  </div>



  <!-- Left and right controls -->


  <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">


      <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>


      <span class="sr-only">Previous</span>


  </a>


  <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">


      <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>


      <span class="sr-only">Next</span>


  </a>


</div>


</j:jelly>



For your usage, you would just change the lines to be relevant to the select html tag.


<select>


        <j:while test="${jvar_gr.next()}">


                <option value="${gr.id}">${gr.name}</option>


        </j:while>


</select>



Hope that helps some.


View solution in original post

9 REPLIES 9

Thanks,



I am comfortable on the GlideRecord side of things, I was just wondering about how far you can take an exposed jelly variable's manipulation.



Also, thanks for the EQUAL sign catch !



regards,


tony


Chuck Tomasi
Tera Patron

Create your list of options in the JavaScript, then use the <j2:forEach></j2:forEach> block to iterate over them. Your HTML needs to be outside the g2:evaluate block to be recognized by the XML parser.



<g2:evaluate var="jvar_options" object="true">


        //Create array of option objects with label and value attributes


</g2:evaluate>



<select>


        // add j2:forEach loop here to display each option tag with value and label


</select>



Check out episodes 1-3 here.



TechNow Episode List


tobrien
Kilo Guru

Thanks you Mr. Tomasi and Mr. Allgire !     Your suggestions are excellent.



I had seen the <j2> mechanisms before but failed to realize how they might be useful in my case. Your examples made it quite clear... thanks!



As I was reviewing the replies I had to wonder (and perhaps you might offer) what is the role of Line#11 ??



gr;



Would line #20 operate successfully without Line #11 ?



Thanks, again !


Line 11 "exposes" the object as jvar_gr (line 5) so line 20 can consume it.


Thanks !