Hi Anthony,
It seems that i got it working ...
The sad part is the graph flickers everytime it renders... :(
Just a dumb question...
Is it possible.. I have this on my controller py
contoller/default.py
def index():
...
return dict()
def update_value():
...
return json(new_value)
and this is on my index.html
/views/default/index.html
...html tags/divs that displays graph
<script type="text/javascript">
graph function...
{{ need to schedule updating of new_value (1 sec interval)}}
var new_value = {{<controller(update_value) returning a value>}}
</script>
what i want to do is ajax(maybe another method not ajax) a certain value to
my view with a different controller(update_value) updating/checking changes
in database every 1 sec interval
Thanks in advance really it does helps a lot...
Thanks,
Jak
On Monday, September 11, 2017 at 10:26:15 PM UTC+8, Anthony wrote:
>
> Looks like your JS runs only at window.onload, but the graph data are
> delivered via Ajax requests.
>
> Anthony
>
> On Sunday, September 10, 2017 at 10:48:31 PM UTC-4, Wabbajack wrote:
>>
>> Hi Anthony,
>>
>> I have successfully get the values from another file... thanks...
>> But for now i have another problem displaying the values into a graph...
>>
>>
>>
>> In views/default/index.html
>> {{extend 'layout.html'}}
>>
>> {{=LOAD('default', 'graph', ajax=True, timeout=500, times='infinity')}}
>>
>> {{=BEAUTIFY(response._vars)}}
>>
>> In my default.py controller
>> from gluon.serializers import json
>>
>> def index():
>> return dict()
>>
>>
>> def graph():
>> temp_graph = []
>> temp=[]
>> timet=[]
>> for x in db().select(db.temperature_table.ALL):
>> temp.append(x.temp_value)
>> timet.append(x.tm_timestamp)
>> temp_graph.append({'y':x.temp_value, 'label':x.tm_timestamp})
>>
>> return dict(temp_graph=json(temp_graph),VA=temp,VB=timet)
>>
>>
>> In views/default/graph.html
>> <script src="{{=URL('static','js/canvasjs.min.js')}}"></script>
>> <div id="chartContainer" style="height: 300px; width: 50%;"></div>
>>
>> {{=VA}}
>> {{=VB}}
>>
>> <br> ------------ Value In Graph ------------ <br>
>> {{=temp_graph}}
>>
>>
>> <script type="text/javascript">
>> window.onload = function () {
>> var chart = new CanvasJS.Chart("chartContainer", {
>> theme: "theme3",
>> legend: {
>> horizontalAlign: "center", // "left" , "right"
>> verticalAlign: "bottom", // "center" , "top"
>> fontSize: 12
>> },
>> title:{
>> text: "Temperature reader"
>> },
>> animationEnabled: false,
>> data: [
>> {
>> type: "line",
>> showInLegend: true,
>> legendText: "temperature",
>> dataPoints: {{=XML(temp_graph)}}
>> }
>> ]
>> });
>> chart.render();
>> }
>>
>> </script>
>>
>>
>> In Browser the <graph.html> renders the graph and value completely with
>> no problems
>>
>>
>> But the in <index.html> the graph does not render.. only Values are
>> shown..
>>
>>
>> I have also tried increasing the value of the timeout maybe the graph is
>> not rendered due to timeout value but still no avail...
>>
>> {{extend 'layout.html'}}
>>
>> {{=LOAD('default', 'graph', ajax=True, timeout=20000, times='infinity')}}
>>
>> {{=BEAUTIFY(response._vars)}}
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On Friday, September 8, 2017 at 7:06:32 PM UTC+8, Anthony wrote:
>>>
>>> What does your newvalue.load view look like? Does it display the temp
>>> and timet lists?
>>>
>>> Note, your index.html view is incorrect -- it has {{=temp}} and
>>> {{=timet}}, but the dictionary returned by the index() function instead
>>> uses VA and VB as keys, so the view should have {{=VA}} and {{=VB}} (should
>>> be the same in your newvalue.load view). Actually, because the returned
>>> values are Python lists, you probably want a more sophisticated display
>>> than simply {{=VA}}.
>>>
>>> Also, note that there is no reason to have two identical functions. You
>>> can instead have a single function and just use two different views and
>>> extensions (i.e., index.html and index.load).
>>>
>>> Even better, just use an Ajax component to load the data and set it to
>>> refresh periodically:
>>>
>>> def index():
>>> return dict()
>>>
>>> def get_data():
>>> ...
>>> return dict(VA=temp, VB=timet)
>>>
>>> In views/default/index.html:
>>>
>>> {{=LOAD('default', 'get_data.load', ajax=True, timeout=1000, times=
>>> 'infinity')}}
>>>
>>> In views/default/get_data.load:
>>>
>>> {{=VA}}
>>> {{=VB}}
>>>
>>> Keep in mind that this is an inefficient way to get realtime updates.
>>> First, you are polling every second, whether or not the data have changed.
>>> Second, you are sending all the data on every request instead of just the
>>> changes. This may be fine for your use case, but a more efficient approach
>>> would be to use a server push pubsub method (e.g., use websockets to
>>> publish updates to the client) -- see
>>> https://github.com/web2py/web2py/blob/master/gluon/contrib/websocket_messaging.py
>>> .
>>>
>>> Anthony
>>>
>>>
>>> On Friday, September 8, 2017 at 2:52:57 AM UTC-4, Wabbajack wrote:
>>>>
>>>> Hi All,
>>>>
>>>>
>>>>
>>>> I am really confused on auto updating variable on view...
>>>> What i want is i have an initial value that is displayed on
>>>> index.html<view> thru query in default.py index function
>>>> But hope to change this values everytime there is a change on the
>>>> database.
>>>>
>>>> I have read this
>>>> https://groups.google.com/forum/#!topic/web2py/XN9Wqb3jqKk
>>>> but still having confusion the variable arent updating or creating new
>>>> string file
>>>>
>>>>
>>>> *controllers/default.py
>>>>
>>>>
>>>> *view/default/index.html
>>>>
>>>>
>>>>
>>>> * Also i have created a file newvalue.load on views/default/ directory
>>>>
>>>>
>>>> *models.py
>>>>
>>>>
>>>> <additional info>
>>>> I am using web2py 2.14 on windows PC
>>>>
>>>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.