使用AngularJS和Express将复杂的表单数据发布到RESTful API

时间:2015-08-17 10:05:44

标签: angularjs express sails.js waterline

我会尝试尽可能快地提出这个问题,但它非常复杂。我有一个api,我试图POST嵌套数据,但我无法弄清楚如何正确地构建数据。

因此,我为调查制作应用程序构建了一个API。通常的结构是用户 - >测验 - >问题 - > QuestionChoice,每个 - >代表一对多的关系。

API的所有模型看起来都很相似,所以我不会在这里发布它们,但这是一个例子。我使用SailsJS和Waterline ORM构建了API。我已经通过浏览器的直接请求对此进行了测试,API和数据库目前工作正常,所以我的问题出在前端。

module.exports = {

    attributes: {

        title: {
            type: 'string',
            required: true
        },

        is_active: {
            type: 'boolean',
            defaultsTo: 'false'
        },

        quiz: {
            model: 'quiz',
            required: true
        },

        choices: {
            collection: 'questionchoice',
            via: 'question'
        }

    }
};

好的,所以在前端,我有一个复杂的嵌套表单,用户可以在其中构建测验数据。这是它的缩写版本:

form(name='newQuiz' ng-submit='createNewQuiz()')
    input.quiz-name(type='text', name='name', class='form-control' ng-model='quiz.name' placeholder='SURVEY NAME')
    .col-lg-6.col-md-6.col-sm-6.col-xs-12.question-column
        input.question-input(placeholder='QUESTION ONE', type='text', name='question', class='form-control', ng-model="quiz.q1.question")
    .col-lg-6.col-md-6.col-sm-6.col-xs-12.answer-column
        input.answer-input(placeholder='ANSWER CHOICE A', type='text', name='answer', class='form-control', ng-model="quiz.q1.answers.a")
        input.answer-input(placeholder='ANSWER CHOICE B', type='text', name='answer', class='form-control' ng-model="quiz.q1.answers.b")
        input.answer-input(placeholder='ANSWER CHOICE C', type='text', name='answer', class='form-control' ng-model="quiz.q1.answers.c")
        input.answer-input(placeholder='ANSWER CHOICE D', type='text', name='answer', class='form-control' ng-model="quiz.q1.answers.d")
    .col-lg-6.col-md-6.col-sm-6.col-xs-12.question-column
        input.question-input(placeholder='QUESTION ONE', type='text', name='question', class='form-control', ng-model="quiz.q2.question")
    .col-lg-6.col-md-6.col-sm-6.col-xs-12.answer-column
        input.answer-input(placeholder='ANSWER CHOICE A', type='text', name='answer', class='form-control', ng-model="quiz.q2.answers.a")
        input.answer-input(placeholder='ANSWER CHOICE B', type='text', name='answer', class='form-control' ng-model="quiz.q2.answers.b")
        input.answer-input(placeholder='ANSWER CHOICE C', type='text', name='answer', class='form-control' ng-model="quiz.q2.answers.c")
        input.answer-input(placeholder='ANSWER CHOICE D', type='text', name='answer', class='form-control' ng-model="quiz.q2.answers.d")
    .button-row
        input.btn.btn-primary.launch-button(type='submit', value='Save Quiz', class='btn btn-primary')
        input.btn.btn-primary.launch-button(class='btn btn-primary' value='Go Live!')

现在,我有点不清楚。在表单提交上运行的createNewQuiz函数。所以我的问题是,我如何在这里构建数据,以便我的API接受它。到目前为止,我所做的一切似乎都没有效果。

$scope.createNewQuiz = function() {
    console.log($scope.currentUser)
    console.log($scope.quiz)
    var newQuiz = {
        user: $scope.currentUser,
        name: $scope.quizName,
        questions: //No idea what to put here
        }

    $http.post('http://localhost:1337/quiz/create', newQuiz)
        .success(function (data, status, headers) {
            alert('new quiz created');
        }).error(function (data, status, headers) {
            alert('error creating new quiz')
            console.log(data, status, headers)
        })
    }
}

1 个答案:

答案 0 :(得分:3)

您的模型嵌套得非常深User --> Quiz --> Question --> QuestionChoice,默认情况下,Waterline无法处理它。您应该通过在创建和/或更新操作时修改默认Blueprint API来处理它。

  1. 您可以将您的嵌套数据放入Angular的请求中
  2. 您必须覆盖自己的默认蓝图创建和/或更新(如果用户可以更新),以满足您的需求。