【问题标题】:nodejs: save data of sortable menu with javascript and send it to mongodbnodejs:用javascript保存可排序菜单的数据并将其发送到mongodb
【发布时间】:2016-12-04 13:04:47
【问题描述】:

已解决!!

我有一个带有 javascript 可排序菜单的弹出窗口。菜单的元素属于猫鼬模式,我想根据来自菜单的新订单列表更新数据库。让我更好地解释一下。我有这个猫鼬模式:

({
  title: { type: String },
  POI: [{
   POIname: { type: String },
   POIlocation: { type: String },
   POItext: { type: String }
  }]
})

我将数组 POI 从 Express 传递到客户端,

    #popupbox
      #riordinabox
        #divhead
          span#exitbox(onclick="closepopupbox('popupbox')", title="EXIT") X
          p Trascina il POI per riordinare la lista
        #divlistaPOI
          each POI in POIs
            .divpopupbox(id="#{POI.POIname}", draggable="true", ondragenter="dragenter(event)" ondragstart="dragstart(event)")
              p #{POI.POIname}
        #divfooter

如您所见,.POIname 元素创建了菜单。允许用户更改列表的顺序并保存新的顺序。例如默认顺序是:

({
  title: "sometitle",
  POI: [{
   POIname: "jump",
   POIlocation: table,
   POItext: "jump on the table"
  }],
     [{
   POIname: "run",
   POIlocation: street,
   POItext: "run on the street"
  }],
     [{
   POIname: "turnR",
   POIlocation: everywhere,
   POItext: "turn right"
  }]
})

并且可排序的菜单显示:

  • 运行
  • 转R

用户操作后,新的订单列表为:

  • 运行
  • 转R

现在我想获取新订单并在数据库中设置相同的订单,因此我可以看到

({
  title: "sometitle",
  POI: [{
   POIname: "run",
   POIlocation: street,
   POItext: "run on the street"
  }],
     [{
   POIname: "turnR",
   POIlocation: everywhere,
   POItext: "turn right"
  }],
     [{
   POIname: "jump",
   POIlocation: table,
   POItext: "jump on the table"
  }]
})

而且我知道先到哪一步。

有什么想法吗?

谢谢!

【问题讨论】:

  • 为什么不用数组? var steps = [{step1}, {step2}, {step3}],这样你就可以像这样更新步骤,var temp = step[1]; steps[0] = temp, steps[1] = step[0]
  • 是的,但是最大的问题是如何向Mongodb发送和设置新订单!
  • 您实际上可以按原样保存它,整个步骤数组,document.title = "sometitle"; document.steps = steps; document.save() 这取决于您如何构建架构

标签: javascript node.js mongodb jquery-ui-sortable mongoose-schema


【解决方案1】:

@YanMayatskiy 我们接近尾声了。我做了这段代码:

 router.get('/:name/orderlist/:list', function(req, res, next) {
  Itinerario.findOne({name: req.params.name}, function(err, itinerario){
    if (err) throw err;
    var temp = [];
    var array = JSON.parse(req.params.list);
    res.send(array);
    for (i=0; i<array.length; i++){
      if (itinerario.POI[i].POIname === array[i]){
        temp[i] = itinerario.POI[i];
      } else {
        var j = 0;
        while (true){
          if( itinerario.POI[i].POIname === array[j] ){
            break;
          }
          j++
        }
        temp[j] = itinerario.POI[i];
      }
    }
    for (i=0; i<temp.length; i++){
      itinerario.POI[i] = temp[i];
    }
    itinerario.save(function (err, itinerario){
      if (err) throw err;
      console.log(itinerario);
    })
  })
});

它可以正常工作,但是有一个问题!最后,当我记录“itinerario”模型时,我可以在提示中看到新的步骤顺序:

({
  title: "sometitle",
  POI: [{
   POIname: "run",
   POIlocation: street,
   POItext: "run on the street"
  }],
     [{
   POIname: "turnR",
   POIlocation: everywhere,
   POItext: "turn right"
  }],
     [{
   POIname: "jump",
   POIlocation: table,
   POItext: "jump on the table"
  }]
})

但是,如果我在 mongo 提示符中执行 find() 方法,我仍然会看到旧的步骤顺序!!!!!!

({
  title: "sometitle",
  POI: [{
   POIname: "jump",
   POIlocation: table,
   POItext: "jump on the table"
  }],
     [{
   POIname: "run",
   POIlocation: street,
   POItext: "run on the street"
  }],
     [{
   POIname: "turnR",
   POIlocation: everywhere,
   POItext: "turn right"
  }]
})

事实上,当我刷新页面时,我又得到了旧订单。它不会将新订单保存在数据库中!!!!

我要疯了!

【讨论】:

  • 解决了!只需添加 itinerario.markModified('POI');在保存()之前。是的!
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 2019-11-03
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多