Skip to Main Content

DevOps, CI/CD and Automation

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

oj-select-single and CollectionDataProvider causing lots of identical xhr requests

Jonathan CorwinMar 3 2020 — edited Mar 6 2020

I have a oj-select-single with the data coming from a CollectionDataProvider via a factory object.

If I leave the oj-select-single without a default value all appears fine.

However if I try and set the default value (line 32 below) it is suddenly firing off a bazillion identical ajax requests before finally giving a Maximum call stack size exceeded error in ojmodel. It doesn't even appear to be waiting for the first one to complete before firing off the next ones, otherwise I'd assume it be due to the data coming back incorrectly.

I'm obviously doing something wrong, but I'm not sure what. Is anyone able to point me in the right direction? Ta.

HTML:

<oj-select-single value="{{empCode}}" data="{{empProvider}}"  item-text="ename"></oj-select-single>

JS:

require(['knockout',

  'ojs/ojcore',

  'jquery',

  'ojs/ojcollectiondataprovider',

  'ojs/ojknockout',

  'ojs/ojselectsingle'

], function(ko, oj, $, CollectionDataProvider) {

  let ViewModel = function() {

    const self = this;

    var EmpFactory = {

        url: 'https://apex.oracle.com/pls/apex/oraclejet/emp/',

        createEmpModel: function () {

            var Emp = oj.Model.extend({

                urlRoot: this.url,

                idAttribute: "empno",

            });

            return new Emp();

        },

        createEmpCollection: function () {

            var Emps = oj.Collection.extend({

                url: this.url,

                fetchSize: 50,

                model: this.createEmpModel()

            });

            return new Emps();

        }

    };

    self.empCode = ko.observable();

    var col = EmpFactory.createEmpCollection();

    self.empProvider = ko.observableArray([]);

    self.empProvider(new CollectionDataProvider(col));

    self.empCode(7698);   

  };

  ko.applyBindings(new ViewModel(), document.getElementById('container'));

});

Example jsfiddle here: https://jsfiddle.net/gushie/mxLfsgdy/1/

Message was edited by: Jonathan Corwin - Fixed URL to broken version

Comments
Post Details
Added on Mar 3 2020
2 comments
420 views