After a delay of more of a year working on other ABM stuff, I finally got back on track with B4JS. I will make a series of tutorials explaining how it works. B4JS is part of the ABMaterial library 4.25 which is going to be released next week.
INTRODUCTION
One way to look at B4JS is as some kind of new platform in B4X, that uses a very similar syntax as B4J. At runtime, the B4J source code is transpiled to pure JavaScript. The generated source code can then be used in e.g. an ABMaterial Web App, or maybe even as a base for another JavaScript library.
A typical B4JS class could look like this:
Sub Process_Globals Dim myString As String Public pubMap As Map Dim timer As Timer Dim myGlobalName As String = "GlobalAlain" End Sub
'Initializes the object. You can NOT add parameters. Public Sub InitializeB4JS() pubMap.Initialize Dim myName As String = "Alain" ' smartstrings do not support date, time or xml functions myString = $"Hello planet "B4X"! This is a test from ${myName} and ${myGlobalName}"$ Log("myString.Contains('planet'): " & myString.Contains("planet")) Dim myLocalInt As Int = 15 myLocalInt = myLocalInt * myString.Length LogMe("15 x the length of " & myString & " = " & myLocalInt) For i=0 To 50 myLocalInt = myLocalInt + 2 Select Case myLocalInt Case 20, 40 Log(i) pubMap.Put("key" & i, i) Case Else Log("less than 20") End Select Next timer.Initialize("timer", 1000) timer.Enabled = True Dim sb As StringBuilder sb.Initialize sb.Append("lijn 1").Append(CRLF).Append("lijn 2") Log(sb.ToString) Log(sb.Length) sb.Insert(2,"X") Log(sb.ToString) sb.Remove(2,3) Log(sb.ToString) End Sub
Private Sub Timer_Tick timer.Enabled = False Log("timer ticking") If timer.Enabled = False Then timer.Interval = timer.Interval + 1000 Log("timer new interval: " & timer.Interval) timer.Enabled = True End If End Sub
Looks very familiar, no?
Having the browser doing some stuff using JavaScript can have some big advantages by relieving some pressure from your server (checking if a form is filled in correctly, or changing the visibility of an ABMContainer if a user clicks a button).
But it also demands a great responsibility from the programmer not to expose to much information to the user. Never, ever write sensitive stuff like SQL, passwords etc in B4JS!
Another advantage is being able to expose some events (like the KeyUp/KeyDown events in an ABMInput field). They are deliberately omitted in ABM, because such events could potentially kill your server. But in Javascript, we could use them e.g. to check if the user could entry numbers, or if fits an email mask.
Having a Timer running on the browser side can also be handy.
First an overview of the syntax B4JS can handle:
OVERVIEW
Core library
Variable types:
Bit:
String:
List:
Map:
StringBuilder:
DateTime:
Keywords:
Operators:
Control Structures:
Timer:
Smart String Literal:
JSON library
JSONParser:
JSONGenerator:
ABMaterial library (as of 2018/03/10, for the latest list check the B4X forum):
ABMLabel:
EVENTS: B4JSOnClick, B4JSOnMouseEnter, B4JSOnMouseLeave
ABMInput:
ABMContainer:
ABMSwitch:
ABMCheckbox:
ABMRadioGroup:
ABMButton:
ABMPage:
ABMRow:
B4JSUniqueKey
EVENTS: B4JSOnClick, B4JSOnMouseEnter, B4JSOnMouseLeave
ABMCell:
B4JSUniqueKey
EVENTS: B4JSOnClick, B4JSOnMouseEnter, B4JSOnMouseLeave
TUTORIALS
In the next following days, I would like to cover the following topics:
01. Getting started
02. Core functions
03. Inline JavaScript
04. Running JavaScript on the server side (mini NodeJS?)
05. JSON & Ajax Calls
06. The UI (ABMaterial) connection
Alwaysbusy
This new feature of ABMaterial its amazing , Great Job!