如何将对象作为参数传递?

时间:2019-06-04 09:08:01

标签: javascript angularjs object

我随机遇到了代码的某些部分。

此对象在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之前,我在那看到正确的数据。 我将数据发送到后端时会丢失数据。这种问题在其他3种情况下发生在我身上。

为什么某些数组在后端可用,为什么其他数组不可用?

我尝试了很多事情,但是发送到后端的对象中的任何一项都变空了。

如果您需要更具体的代码,请在注释中告诉我。

更新

代码在这里我将类别推入控制器中

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中添加链许诺和在嵌套在getCategoryByName()方法中的updateTest()方法或多或少地类似于@ T.J的问题。人群拥挤,所以我给它答复。

1 个答案:

答案 0 :(得分:2)

  

代码在这里我将类别推入控制器中

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.pushconsole.log 似乎向您显示this.tData.category中内容的原因是(如我在评论中提到的),原因是deferred evaluation in the console

这也解释了为什么有时发生的原因:您在该Category.getCategoryByName操作和调用updateStuff的操作之间存在竞争。有时,Category.getCategoryByName获胜,因此updateStuff包含推送的信息,而其他时候,调用updateStuff的代码获胜,因此updateStuffthis.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失败,则会在控制台中导致“未处理的拒绝”错误。)