创建具有关联的对象时,SailsJS触发更新

时间:2014-12-16 23:07:27

标签: javascript socket.io associations sails.js waterline

我正在使用Sails v0.10.5。

我创建了三个模型,它们之间有关联。有Candidate模型,Evaluator模型和Rating模型,评估者通过该模型对候选人进行评级。我正在使用Waterline关联自动跟踪从RatingEvaluatorCandidate的外键。

我也在使用Blueprint自动处理这些模型的所有CRUD路由。

不幸的是,每当我通过Blueprint创建一个新的候选人时,除了触发预期的CREATE之外还会使用http://localhost:1337/rating/create?rating=4&comment=Great&evaluator=3&candidate=2之类的URL,sails也会返回并调用2 UPDATE& s CandidateEvaluator中的每一个都已设置。

这会导致我的应用程序的前端出现问题,因为它收到UPDATE事件而不是CREATE事件,并且没有必要的上下文来正确处理来自服务器的新数据。 / p>

解决此问题的任何建议都会有所帮助!

以下是Waterline模型:

/api/models/Candidate.js

module.exports = {
  schema: true,
  attributes: {
    name: {
      type: 'string',
      required: true
    },
    status: {
      type: 'string',
      required: true
    },
    role: {
      type: 'string',
      required: true
    },
    ratings: {
      collection: 'rating',
      via: 'candidate'
    }
  }
};

/api/models/Evaluator.js

module.exports = {
  schema: true,
  attributes: {
    name: {
      type: 'string',
      required: true
    },
    title: {
      type: 'string',
      required: true
    },
    role: {
      type: 'string',
      required: true
    },
    ratings: {
      collection: 'rating',
      via: 'evaluator'
    }
  }
};

/api/models/Rating.js

module.exports = {
  schema: true,
  attributes: {
    rating: {
      type: 'integer',
      required: true
    },
    comment: {
      type: 'string',
      required: false
    },
    evaluator: {
      model: 'evaluator',
      required: true
    },
    candidate: {
      model: 'candidate',
      required: true
    }
  }
};

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。您可以在更新事件中创建一个过滤器,以检查并查看某些变量是否已更新,如果是,则调用一些影响前端的功能。

答案 1 :(得分:0)

您可以覆盖publishCreate模型的Rating。大多数code in the default publishCreate method致力于确定哪些关联通知新模型,以及如何通知它们;因为这正是您不想要的,所以models/Rating.js中的方法可以非常简单:

publishCreate: function (values, req) {

  // Get all of the "watchers" of the Rating model
  var watchers = Rating.watchers();

  // Remove the socket responsible for the creation, if you don't want
  // it to get the "create" message too
  watchers = _.without(watchers, req.socket);

  // Send a message to the sockets with the "rating" event and the payload
  // expected for the "publishCreate" message
  sails.socket.emit(sockets, "rating", {
      verb: 'created',
      data: values,
      id: values[this.primaryKey]
  });

  // Subscribe all watchers to the new instance, if you're into that
  this.introduce(values[this.primaryKey]);

}

请注意,publishCreate是模型的方法,因此它之外的<{1}}对象。