首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么全堆栈角发生器使用Lo的合并而不是document.set?

为什么全堆栈角发生器使用Lo的合并而不是document.set?
EN

Stack Overflow用户
提问于 2014-12-19 17:07:21
回答 2查看 718关注 0票数 1

这是用于更新的默认代码:

代码语言:javascript
运行
复制
exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Thing.findById(req.params.id, function (err, thing) {
    if (err) { return handleError(res, err); }
    if(!thing) { return res.send(404); }
    var updated = _.merge(thing, req.body);
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, thing);
    });
  });
};

请注意以下一行:var updated = _.merge(thing, req.body);。这只适用于作为原语的架构属性。例如:它不适用于作为数组的架构属性。

问题是thing是一个猫鼬文档,而req.body是一个javascript对象。

对于真正的问题,我有两个假设:

  1. .merge()要求第一个参数是一个对象,但它正在接收一个文档。
  2. 只有当两个对象具有相同的键和类型时,_.merge()才会合并。因为一个是文档,另一个是对象,所以它们是不同的。

以这个例子为例。name已正确更新,但arr未更新。但是,当我使用thing.set(req.body)而不是var updated = _.merge(thing, req.body)时,两者都会被正确地更新。

thing.html

代码语言:javascript
运行
复制
<div class="container">
  <form ng-submit="update()">
    <div class="form-group">
      <label>Name</label>
      <input class="form-control" ng-model="thing.name">
    </div>
    <div class="form-group">
      <label>Arr</label>
      <input
        type="text"
        class="form-control"
        ng-repeat="el in thing.arr"
        ng-model="thing.arr[$index]">
    </div>
    <button 
      class="btn btn-default"
      type="submit">
      Update
    </button>
  </form>

  {{thing | json}}
</div>

thing.controller.js (前端)

代码语言:javascript
运行
复制
.controller('MainCtrl', function ($scope, $http) {
  $http.get('/api/things')
    .success(function(things) {
      $scope.thing = things[0];
    });
  $scope.update = function() {
    $http.put('/api/things/' + $scope.thing._id, $scope.thing)
      .success(function(newThing) {
        console.log('updated thing: ', newThing);
      })
      .error(function() {
        console.log('unable to update thing');
      });
  };
});

thing.model.js

代码语言:javascript
运行
复制
'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var ThingSchema = new Schema({
  name: String,
  arr: []
});

module.exports = mongoose.model('Thing', ThingSchema);

thing.controller.js (后端)

代码语言:javascript
运行
复制
'use strict';

var _ = require('lodash');
var Thing = require('./thing.model');

exports.update = function(req, res) {
  if(req.body._id) { delete req.body._id; }
  Thing.findById(req.params.id, function (err, thing) {
    if (err) { return handleError(res, err); }
    if(!thing) { return res.send(404); }
    var updated = _.merge(thing, req.body);
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.json(200, thing);
    });
  });
};

function handleError(res, err) {
  return res.send(500, err);
}

两个问题:

  1. 使用_.merge()有什么问题?
  2. 为什么角度全叠发生器的创建者选择使用_.merge()?我肯定他们知道它的行为,所以他们一定有理由。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-28 15:51:52

在markModified返回值上调用‘_.merge’(正如前面的答案所建议的那样)没有为我解决这个问题。Adam报告的问题是,_merge导致“更新”对象包含数组属性的无效数据。我也在使用角满栈生成器来体验这个问题,例如,如果我从数组中删除元素,这个更改不会存储在Mongoose/mongo中。在猫鼬文档上调用set函数(例如,thing.set(.,如Zerner所建议的)解决了这个问题。我还阅读了这个讨论主题:https://github.com/DaftMonk/generator-angular-fullstack/issues/637;它建议用同样适用于我的_extend (也请参阅https://github.com/DaftMonk/generator-angular-fullstack/issues/310)代替_merge。

票数 1
EN

Stack Overflow用户

发布于 2014-12-23 15:16:13

您需要用户"markModified“文档标记修改

代码语言:javascript
运行
复制
var updated = _.merge(store, req.body);
updated.markModified('foo_name');
updated.save(function (err) {
  if (err) {
    return handleError(res, err);
  }
  return res.json(200, store);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27570708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档