Как передать объект в качестве параметра? - PullRequest
0 голосов
/ 04 июня 2019

У меня проблемы с некоторыми частями моего кода случайно.

Этот объект объявлен в angular controller.

this.tData = {
   'questions':[],
   'typeQuestion':[],
   'category':[],
   'dName':this.dName,
   'tCodigo':this.tCodigo}

Затем я получил некоторые данные из других функций и вставил их в соответствующие поля,

this.tData.questions.push(this.idQuestion) // this come from frontend ng-model
this.tData.typeQuestion.push(this.typeQuest) // this come from frontend ng-model
this.tData.category.push(this.idCategory)// this come from frontend ng-model

Это отлично сконструирует мой объект. console.log(this.tData) покажет мне объект совершенно нормально. Но потом, когда я передаю его бэкэнду в этой функции angular service.

this.updateStuff = function(codStuff,tData){
 return $http.put('/updateStuff' + codStuff,tData)}

Объект, который выполняет бэкэнд console.log(params), является

{
 questions:['exampleId'],
typeQuestion:['exampleData'],
category:[], // HERE IS THE PROBLEM
dName:'exampleName',
tCodigo:'exampleCod'}

Как вы видите, category:[] пуст, но делает console.log(tData) на службе angular, прежде чем отправить его, и вижу там правильные данные. Я пропускаю данные, когда отправляю их на сервер. Эта проблема случилась со мной в трех других подобных случаях.

Почему некоторые массивы хороши в бэкенде, а другие нет?

Я много чего перепробовал, но когда-либо 1 предмет объекта, который я отправлял на сервер, становился пустым.

Если вам нужен более конкретный код, сообщите мне в комментариях.

Обновление

Код здесь я нажимаю категорию в контроллере:

this.getCategoryByName = function(){
  this.bName = document.getElementById('seCategory').value;
  Category.getCategoryByName(this.bName).then((result)=>{
    this.idCategory = result.data.data._id; // this give me id of category
    this.tData.category.push(this.idCategory);
  })
  }

2

Здесь я вызываю свои функции:

<button class="btn btn-primary" ng-click="ctController.getCategoryByName(); ctController.updateTest();" > up </button>

Это код функции updateTest ():

this.updateTest = function(){
Test.updateTest(this.codTest,this.tData).then(result=>{})
}

Выше метода вызовите angular service updateStuff

решаемые

Решено добавление цепочки обещаний в метод getCategoryByName и добавление метода updateTest (), вложенного в метод getCategoryByName (), более или менее похожий на @ T.J. Crowder Sugest, поэтому я даю ему ответ.

1 Ответ

2 голосов
/ 04 июня 2019

Код здесь я нажимаю категорию в контроллере:

this.getCategoryByName = function(){
  this.bName = document.getElementById('seCategory').value;
  Category.getCategoryByName(this.bName).then((result)=>{
    this.idCategory = result.data.data._id; // this give me id of category
    this.tData.category.push(this.idCategory);
  })
  }

Это говорит нам о том, что вы звоните updateStuff до того, как Category.getCategoryByName завершит свою работу, и поэтому до this.tData.category.push. Причина, по которой console.log , кажется, показывает вам вещи в this.tData.category (как я упоминал в комментарии) из-за отложенной оценки в консоли .

Это также объясняет, почему это происходит иногда : между этой операцией Category.getCategoryByName и операцией, вызывающей updateStuff, есть гонка. Иногда Category.getCategoryByName выигрывает и поэтому updateStuff включает в себя отправленную информацию, в других случаях код, вызывающий updateStuff, выигрывает и поэтому updateStuff не имеет информации в this.tDate.category (пока).

this.getCategoryByName должен вернуть цепочку обещаний:

    this.getCategoryByName = function(){
      this.bName = document.getElementById('seCategory').value;
      return Category.getCategoryByName(this.bName).then((result)=>{
//    ^^^^^^
        this.idCategory = result.data.data._id; // this give me id of category
        this.tData.category.push(this.idCategory);
      });
    };

... и тогда вы должны сделать все, что звонит updateStuff зависимым от разрешения этого обещания.

(Вы также захотите убедиться, что что-то обрабатывает путь отклонения цепочки. Ваш текущий getCategoryByName игнорирует ошибки, которые приводят к ошибкам «Необработанное отклонение» в консоли при сбое Category.getCategoryByName.)

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