Change Date/View without reloading DataSource

6 posts, 0 answers
  1. Grant
    Grant avatar
    82 posts
    Member since:
    Jul 2016

    Posted 07 Aug Link to this post

    Hi,

    As my title suggests I'd like to be able to pragmatically update the date and the view in a Schedule without the DataSoruce automatically reloading after each one is set.

    I use a remote datasource and its a waste of resources for me to set the date and the scheduler reads the datasource, then I set the view and the scheduler reads the datasource again.I tried using the one() to preventDefault on navigate before settign either the view or date, but that had no affect. Example here, http://dojo.telerik.com/aHutu

    Any advise would be appreciated.

    Thanks and kind regards, 
    Grant

  2. Tyler
    Tyler avatar
    19 posts
    Member since:
    Jul 2017

    Posted 07 Aug in reply to Grant Link to this post

    The .one() method is only going to execute once (the first time), so it would only cover the first time you change something and you are changing it twice...

    However, the navigate event does not get called when you change the view and date with .view() and .date() methods. You should bind it to the dataBinding event, and put one before changing the view and changing the date, so you have two .one().

    Like:

    sch.one("dataBinding", function(e) {
        console.log('one off dataBinding');
        e.preventDefault();
      });
      sch.view("day");
      sch.one("dataBinding", function(e) {
        console.log('one off dataBinding');
        e.preventDefault();
      });
      sch.date(new Date());

     

    e.preventDefault() will not stop code you have inside that from executing... but it will that event from executing its default behavior (like triggering other events to read data).

  3. Grant
    Grant avatar
    82 posts
    Member since:
    Jul 2016

    Posted 15 Aug in reply to Tyler Link to this post

    Hi Tyler, 

    Thanks for getting back to me. Unfortunately I've only been able to get to this reply now.

    I've tried implementing your solution but there is no effect. I've created a simple demo (https://dojo.telerik.com/OhEDa) to show this. 
    When you run it the first time, 'BINDING' in only logged once as per a default setup. If you then uncomment the last line where the view is reset. Even though the dataBinding is suppose to be prevented the second time, 'BINDING' is logged twice in the console, first time for initialization, the second time when the view is reset. Only after the binding does the 'dataBinding prevention method' execute.
    So is the preventDefault working too late?

    I've included the event object on the sch.one() callback, and printed it in the console. there is preventDefault function, but its not logged in the scheduler API for the dataBinding event. does this mean is not supported?

    Any advise would be appreciated.

    Thanks,
    Grant

  4. Tyler
    Tyler avatar
    19 posts
    Member since:
    Jul 2017

    Posted 15 Aug in reply to Grant Link to this post

    The reason nothing happens when you have that view change commented out is that the .one() is similar to .on(), but only executed the first time. So dataBinding happens on initial scheduler creation, then you bind a function to happen once the next time dataBinding is executed. 

    However, dataBinding and dataBound for the scheduler fires off for just about any kind of change that is going on in the scheduler. I am not 100% sure its exact inner workings, but yes, I noticed that it gets called when you call sch.view() and sch.date() even after setting the .one(), then the function in the .one() is called. 

    Perhaps an option to look into is simply use a global flag.

    var dataBindThings = false;

    $(document).ready(function(){

       scheduler = $('#scheduler').kendoScheduler({

            dataBinding: function(e){

                if(dataBindThings == false){

                        e.preventDefault();

                }

                else{

                       //do your stuff

                }

            }

        }).data('kendoScheduler');

        scheduler.view('day');

        scheduler.date(new Date());

        

    });

     

    Then set the variable to true only in situations when you want dataBinding to occur. Or if you want it to occur the first time, set it to true initially, and then set it to false in dataBinding.

  5. Veselin Tsvetanov
    Admin
    Veselin Tsvetanov avatar
    558 posts

    Posted 16 Aug Link to this post

    Hi Grant,

    I am not sure if I fully understand the issue faced. On the following Dojo you will find a Scheduler and two buttons. By clicking on them, the user could change the current view (to week) or the date (to today). As you will see in the Network tab of the browser developer tools, there is no remote call made on each navigation (to a different view or date).

    Do you observe a different behaviour at your end? Is there something that I miss in the described scenario?

    Regards,
    Veselin Tsvetanov
    Progress Telerik
    Try our brand new, jQuery-free Angular 2 components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
  6. Grant
    Grant avatar
    82 posts
    Member since:
    Jul 2016

    Posted 17 Aug Link to this post

    Hi Gents, 

    I just wanted to get my ducks in a row before answering.

    @Tyler, Thanks for the idea about using a flag, I did try it, and it lead me to discover I was actually asking the wrong question. It turns out I was trying to prevent the dataBinding thinking that it would prevent a server request. I have no discovered that (obviously) those are two different things.

    @Veselin, I was experiencing something different. Whenever I set the date or the view a data request would be made to the server. What made it even stranger was that sometimes manually setting the view would prevent future data retrieval. I have been unable to discover why this was happening.

    After all this I have found a solution to my problem, and that was to enable serverFiltering, which would force a data request to be made each time the viewable date range changes. And I replaced the transport.read options with a function, which I can use to prevent a read request from executing if needed.

    My apologies for wasting any time and appreciate the effort non-the-less.

    Regards,
    Grant

Back to Top