Встраивание данных в схему Mongoose с помощью angularJS. СРЕДНИЙ стек

Я использую модуль CRUD в mean.js для добавления данных в свое веб-приложение.

У меня нет проблем с добавлением строк и т. д., однако у меня возникают проблемы с встроенными данными.

Мой желаемый формат данных ниже.

{
    "_id":"5559abc02ef1bcdc2e6e6137",
    "messages": [
        "title":"title of msg",
        "msg":"msg content"
    ],
    "created":"2015-05-19T09:30:25.117Z",
    "department":"finance",
    "name":"accounts receivable"
}

Из этого фрагмента я хочу иметь возможность вставлять данные в поле messages. Я видел идеи о том, как это сделать, в таких сообщениях, как этот помещение объекта в схему массива в Mongoose.

Однако я не уверен, как реализовать это решение с помощью angular. Пока у меня есть ниже, который работает для всех полей, кроме поля сообщений.

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

    /**
     * Team Schema
     */
    var TeamSchema = new Schema({
        name: {
            type: String, //eg accounts receivable
            default: '',
            required: 'Please fill Team name',
            trim: true
        },
        department: {
            type: String, //eg finance
            default: '',
            required: 'Please fill department',
            trim: true
        },
        messages: [
          {
            title: {type: String},
            msg: {type: String}
          }
        ],

        created: {
            type: Date,
            default: Date.now
        },
        user: {
            type: Schema.ObjectId,
            ref: 'User'
        }
    });

    /**
     * Create a Team
     */

    var mongoose = require('mongoose'),
        errorHandler = require('./errors.server.controller'),
        Team = mongoose.model('Team'),
        _ = require('lodash');

    exports.create = function(req, res) {
        var team = new Team(req.body);
        team.user = req.user;
        team.save(function(err) {
            if (err) {
                return res.status(400).send({
                    message: errorHandler.getErrorMessage(err)
                });
            } else {
                res.jsonp(team);
            }
        });
    };

    /**
     * Angular controller
     */

    $scope.create = function() {
        // Create new Team object
        var team = new Teams ({
            name: this.name,
            department: this.department,
            messages: this.messages.title
            //this.messages[0].title
        });

        // Redirect after save
        team.$save(function(response) {
            $location.path('teams/' + response._id);

            // Clear form fields
            $scope.name = '';
            $scope.department = '';
            $scope.messages.title = '';
        }, function(errorResponse) {
            $scope.error = errorResponse.data.message;
        });
    };

Угловой вид

    <form class="form-horizontal" data-ng-submit="create()" novalidate>
        <fieldset>
            <div class="form-group">
                <label class="control-label" for="name">Name</label>
                <div class="controls">
                    <input type="text" data-ng-model="name" id="name" class="form-control" placeholder="Name" required>
                </div>
            </div>
            <div class="form-group">
                <label class="control-label" for="department">Department</label>
                <div class="controls">
                    <input type="text" data-ng-model="department" id="department" class="form-control" placeholder="Department" required>
                </div>
            </div>
            <div class="form-group">
                <label class="control-label" for="messages">messages</label>
                <div class="controls">
                    <input type="text" data-ng-model="messages.title" id="messages" class="form-control" placeholder="messages">
                </div>
            </div>                
            <div class="form-group">
                <input type="submit" class="btn btn-default">
            </div>
            <div data-ng-show="error" class="text-danger">
                <strong data-ng-bind="error"></strong>
            </div>
        </fieldset>
    </form>

Как я могу сохранить заголовок сообщения и сообщение, как я сохраняю другие элементы?

Я также потенциально хотел бы дать пользователям возможность добавлять свои собственные поля в это поле сообщений, чтобы они могли добавлять свои собственные настройки в модель, поэтому было бы хорошо, если бы решение, а не явно упомянутый заголовок и сообщение, вместо этого ссылался на элемент each .


person ak85    schedule 19.05.2015    source источник


Ответы (1)


Вам нужно создать массив сообщений в функции $scope.create, примерно так при создании нового командного объекта:

// Create new Team object
var team = new Teams ({
    name: this.name,
    department: this.department,
    messages: [
        { title: this.messages.title, msg: "" }
    ]
});

Чтобы добавить несколько сообщений с разными заголовками и т. д., я бы создал переменную области для хранения сообщений (например, $scope.messages = [{title:"",msg:""}]), а затем использовал ng-repeat для повторения ее в вашем шаблоне для создания нескольких входов:

<input type="text" data-ng-repeat="message in messages" data-ng-model="message.title" id="messages" class="form-control" placeholder="messages">

Затем у вас может быть кнопка «добавить сообщение», подключите ее, чтобы нажать еще один {title:"",msg:""} в массив $scope.messages. Наконец, вы снова обновите свою функцию $scope.create, чтобы добавить этот массив в качестве значения для поля сообщений:

// Create new Team object
var team = new Teams ({
    name: this.name,
    department: this.department,
    messages: this.messages
});

При очистке формы просто установите $scope.messages обратно в исходное значение массива с одним элементом.

person Mark Hughes    schedule 19.05.2015
comment
Спасибо за ответ, я немного запутался в том, что добавить в новую часть объекта Team? Я попробовал оба ваших сообщения с предложениями: [{ title: this.messages.title, msg: }] и сообщения: this.messages, кажется, оба возвращают мне messages: "object Object" на этом этапе? Вы знаете, где я могу ошибаться здесь? - person ak85; 20.05.2015
comment
@ ak85 У вас есть определение класса Teams? - person Mark Hughes; 20.05.2015