Как вы можете убедиться, что глобальный объект javascript обновлен и на него правильно ссылаются? - PullRequest
0 голосов
/ 03 марта 2020

Я занимаюсь разработкой проекта, в котором требуется, чтобы глобальный объект создавался с начальными значениями, обновлялся через службу Angular, а затем снова вызывался из собственного файла с обновленными значениями.

Идеал рабочий процесс будет выглядеть примерно так:

  1. Пользователь вводит данные и вызывает событие
  2. Служба реагирует на событие и соответственно вносит изменения в значения глобального объекта
  3. Пользователь вызывает событие для информация об обновлении
  4. Событие обновления вызывает функцию
  5. Функция ссылается на глобальный объект с обновленными значениями и соответственно передает изменения

В настоящее время служба соответствующим образом вызывает глобальную функцию и регистрирует ее из объекта, чтобы подтвердить, что значения были изменены. Тем не менее, когда я пытаюсь ссылаться на обновленный объект изнутри его собственного файла, консоль отключает тот же объект без его новых значений.

Я пытался обновить значения, используя как упрощенные файлы js, так и Angular услуг и оба дают одинаковую проблему. Я также пытался ссылаться на объект, используя различный синтаксис, включая всегда указание на window.object или просто на объект. Тот же результат сохраняется.

Ниже приведен код, помогающий лучше очертить контекст.

Функция, которая должна ссылаться на обновленные значения, называется "prepareExternalInterface" и вложена следующим образом :

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Я удалил некоторый код для ясности.

window.addEventListener('load', function() {

function prepareExternalInterface(app) {
    // register functions in the app.ExternalInterface to call them from Puzzles
    app.ExternalInterface.updateModel = function(){
        console.log("Attempting to update model:")
        console.dir(window.nexus)
        
        let resizeModel= function(height,width,depth){
          v3d.puzzles.procedures.resizeModel(height,width,depth)
        }
        resizeModel(nexus.heightShapeFactor,nexus.widthShapeFactor, nexus.depthShapeFactor);

        let displayCurrentDoor= function(door){
            v3d.puzzles.procedures.displayCurrentDoor(door)
        }
        displayCurrentDoor(nexus.currentDoor);

        let displayPrintPocket=function(selected){
            if (selected){ v3d.puzzles.procedures.showPrintPocket() } else { v3d.puzzles.procedures.hidePrintPocket() } 
        }
        displayPrintPocket(nexus.drawingPocket);

        let displayRainSheild=function(selected){
            if (selected){ v3d.puzzles.procedures.showRainSheild() } else { v3d.puzzles.procedures.hideRainSheild() } 
        }
        displayRainSheild(nexus.rainSheild);
    }

}

Объект, на который он пытается сослаться, называется «связующим звеном» и определяется как единый объект в глобальной области видимости следующим образом. ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Я удалил некоторый код в интересах ясности.

var nexus = { 

    heightShapeFactor: 0,
    widthShapeFactor: 0,
    depthShapeFactor: 0,
    
    door: true,
    drawingPocket:false,
    noPlate:false,
    rainSheild: false,
    customLatch: false,
    twoPTN: false,
    threePTN: false,

    currentDoor: 'NEMA Door',

    nexusImport(nexusUpdate,selectedAccessories,selectedParameters){
        this.heightShapeFactor = nexusUpdate.heightShapeFactor;
        this.widthShapeFactor = nexusUpdate.widthShapeFactor;
        this.depthShapeFactor = nexusUpdate.depthShapeFactor;

        for(let i=0;i<selectedAccessories.length;i++){
            switch(selectedAccessories[i]){
                case'Drawing Pocket':
                    console.log("Drawing Pocket selection has been imported to the Nexus")
                    this.drawingPocket=true;
                    break;
                case'No Plate':
                    console.log("No Plate selection has been imported to the Nexus")
                    this.noPlate=true;
                    break;
                case'NEMA Rain Sheild' :
                    console.log("NEMA Rain Sheild selection has been imported to the  Nexus")
                    this.rainSheild=true;
                    break;
                case'Custom Latch':
                    console.log("Custom Latch selection has been imported to the Nexus")
                    this.customLatch=true;
                    this.selectDoor(selectedParameters)
            }
        }
        console.log(nexus)
    }
}

Когда я запускаю свою программу, начальные настройки такие же, как показано выше для объекта nexus. После импорта настроек с помощью nexusImport он выходит из системы с обновленными значениями. Затем запускается событие, которое вызывает внешний интерфейс, который также выходит из объекта связи. Вот фрагмент журнала консоли:

No Plate selection has been imported to the Nexus
N12_Model.js:44 {heightShapeFactor: 0.17, widthShapeFactor: 0.33, depthShapeFactor: 0.6, door: true, drawingPocket: true, …}
N12_Model.js:285 Attempting to update model
N12_Model.js:286 {heightShapeFactor: 0, widthShapeFactor: 0, depthShapeFactor: 0, door: true, drawingPocket: false, …}

Будем очень благодарны за любые индикаторы того, с чего начать отслеживать эту проблему, или за альтернативные методы определения и обновления объекта nexus. Или, может быть, я просто не понимаю правильный синтаксис. Я довольно новичок в javascript. Все помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...