извлечь содержимое из объекта, Nodejs

0

Я использую стек MEAN и пытаюсь извлечь информацию из объекта, но атрибуты меняются в зависимости от множества факторов, поэтому не могут их называть. Есть ли способ получить информацию по-другому? Данные будут использоваться для обновления различных вещей в моем монохромном режиме.

Простая информация о моей базе данных: 3 коллекции. Пользователи, годы, курсы.

Год: id, userid, курсы {курс, класс,}

Курс: id, имя, титры и т.д.

Мне удалось отправить информацию в файл nodejs, но ничего не могу с этим поделать. Ниже приведен результат консольного ввода информации. Как получить информацию из объекта, чтобы я мог обновлять мою базу данных?

Результат из журнала

Object {year: Object, grade: Object}
    grade:Object
          574d8ce6bfb4ea470a2e10c7:"3"
          __proto__:Object
    year:Object
         574e8cf5ae8fc00917ded99b:true
         __proto__:Object

  Grade contains the id of the course for which I want to change the grade and the grade 
  I want to change to. 
  Year contains the Id of the year in which the course is stored. 

главная /index.html

Ниже приведена только форма. Переменная year.XXX выполняет итерацию более года (Получено из базы данных).

year.course = {id: XX, класс: YY}

theCourse итерации по всем курсам в базе данных, чтобы получить информацию о конкретном курсе.

vm.change - это переменная, отправленная на контроллер.

 <form>
     <div class="panel-heading " ><b>  YEAR {{year.year}}</b>
         <label style="float: right;"> Edit
             <input type="checkbox" id="year._id" value="year.id" ng-model="vm.change.year[year._id]"/>
                </label>
                <div><p>Sum of Credits: {{year.totalCredits}}</p></div>
            </div>
            <div class="panel-body hideyear" >
                <div class="col-xs-12">
                    <h4>HT</h4>
                    <table class="table " >
                        <tr class="active" >
                            <th><b>Course code</b></th>
                            <th><b>Grade</b></th>
                            <th><b>Update Grade</b></th>
                        </tr>
                        <tbody ng-repeat= "course in year.courses">
                        <tr ng-repeat="theCourse in vm.courses" ng-if="theCourse._id==course.id && (theCourse.term=='HT1'||theCourse.term=='HT2')">
                            <td >{{theCourse.courseCode}}</td>
                            <td>{{course.grade}}</td>
                            <td ><select ng-disabled="!vm.change.year[year._id]" ng-model="vm.change.grade[course.id]">
                                <option disabled selected value> -- update grade -- </option>
                                <option value="NA">NA</option>
                                <option value="5">5</option>
                                <option value="4">4</option>
                                <option value="3">3</option>
                                <option value="G">G</option>
                                <option value="U">U</option>
                            </select></td>
                        </tr>
                        </tbody>
                    </table>
                </div>
                </div>
                <button type="submit"  class="btn btn-primary" ng-disabled="!vm.change.year[year._id]" ng-click="vm.saveChange(vm.change)">Save</button>
            </div>
            </form>

index.controller.js

 function saveChange(change){
        console.log(change)
}

РЕДАКТИРОВАТЬ

В файле под названием app.js vm для Controller as и выберите, какой контроллер использовать:

(function () {
    'use strict';

    angular
        .module('app', ['ui.router'])
        .config(config)
        .run(run);

    /*
    Connects the right subpage with corresponding controller and url.
    */

    function config($stateProvider, $urlRouterProvider) {
        // default route
        $urlRouterProvider.otherwise("/");

        $stateProvider
        .state('home', {
            url: '/',
            templateUrl: 'home/index.html',
            controller: 'Home.IndexController',
            controllerAs: 'vm',
            data: { activeTab: 'home' }
        });
    }

Когда html загружается, контроллер собирает некоторую информацию из базы данных, которая используется на большинстве частей страницы.

function initController() {
        // get current user
        UserService.GetCurrent().then(function (user) {
            vm.user = user;

        });
        //Gets all years in the database
        YearService.GetAll().then(function (years) {
            vm.years = years;
        });
        // Gets all courses in the databased.
        CourseService.GetAll().then(function (courses) {
            vm.courses = courses;
        });
    }

Все входящие в initcontroller выше делают почти то же самое, поэтому я покажу процесс для одного из них, YearSevice.GetAll, вызывает app-service/year.service.js

(function () {
'use strict';

    angular
        .module('app')
        .factory('YearService', Service);

    function Service($http, $q){
        var service =  {};
        service.GetAll = GetAll;
        return service;

        function GetAll() {
        return $http.get('/api/year/getAll').then(handleSuccess, handleError);
        }

с $ http.get мы переходим через сервер к серверному контроллеру year.controller.

var config = require('config.json');
var express = require('express');
var router = express.Router();
var YearService = require('services/year.service');

// routes

router.get('/getAll', getAll);

function getAll(req,res){
    YearService.getAll()
         .then(function(result){
            if(result){
                res.send(result);
            }else{
                res.sendStatus(404);
            }
        })
         .catch(function(err){
            res.status(400).send(err);
         });
}

YearService.getAll вызывает серверные службы: services/year.services.js

var config = require('config.json');
var _ = require('lodash');
var Q = require('q');
var mongo = require('mongoskin');


//Connectionsstring to the mongo database, if the app is runed on openshift the connectionstring value will change.
var connectionString = "mongodb://localhost:27017/mean-stack-registration-login-example";
if(process.env.OPENSHIFT_MONGODB_DB_URL){
    connectionString = process.env.OPENSHIFT_MONGODB_DB_URL + "studycontrol";
}
var db = mongo.db(connectionString, { native_parser: true });


db.bind('years');
db.bind('users');
db.bind('courses');

var service = {};
service.getAll = getAll;
module.exports = service;


function getAll(){
    var deferred = Q.defer();

    //
    db.collection('years').find().toArray(function(err, result) {
        if (err) deferred.reject(err);
        deferred.resolve(result);
        return deferred.promise;
    });
    return deferred.promise;

}

И коллекция возвращается allt путь к html-коду. Отправка новой информации в базу данных имеет одинаковую структуру, но включает в себя объект, который должен быть отправлен с целым временем. В предыдущих случаях объект был легко построен, но теперь мне нужно отправить код курса, год-идентификатор и оценку, и я пытаюсь сделать это, используя флажок и выбор, поэтому три значения, но на двух "носителях".

Теги:
object
mean

2 ответа

1

для доступа к данным, хранящимся в объектах, на которые вы ссылаетесь, вы можете либо получить к нему доступ, как это:

grade.id

или как это

grade['id']

Если вы не уверены, что объект содержит какое-либо заданное свойство, вы можете проверить следующее:

grade.hasOwnProperty('id')

Если вы просто хотите войти в консоль для содержимого содержимого объекта, вы можете сделать это следующим образом:

console.log( JSON.stringify( grade ) );

Надеюсь, что это ответ на ваш вопрос

  • 0
    К сожалению, это не работает. класс получает идентификатор свойства, он получает свойство с именем, идентичным идентификатору курса, который я пытаюсь изменить. Поэтому я не могу получить к нему доступ с помощью идентификатора, поскольку он меняется в зависимости от того, какой курс я хочу изменить. Регистрируйте его только в консоли, потому что я хочу видеть атм содержимого, чтобы понять, как продолжить. @Stian
  • 0
    Тогда я не уверен, что я понимаю, в чем твоя проблема? Появилось, как вы просто хотели использовать некоторую информацию, хранящуюся в объекте?
Показать ещё 3 комментария
0

Почему вы делаете это так сложно - ctrl.save(ctrl.courses) имеет всю информацию, которая должна быть сохранена.

angular.module('app', [])
  .factory('grades', function() {
    var grades = {}
    grades.courses = [{
      code: 'abc',
      grade: 1
    }, {
      code: 'bca',
      grade: 5
    }, {
      code: 'cab',
      grade: 3
    }]
    grades.available = [1, 2, 3, 4, 5]
    return grades
  })
  .controller('firstCtrl', function(grades) {
    this.availableGrades = grades.available
    this.courses = angular.copy(grades.courses)
    this.save = function(courses) {
      grades.courses = angular.copy(courses)

      // as we have all needed data in controller
      // we can also do it like that
      //
      // grades.courses = angular.copy(this.courses)
    }
  })
  .controller('secondCtrl', function($scope, grades) {
    this.availableGrades = grades.available
    this.courses = grades.courses

    $scope.$watch(function() {
      return grades.courses
    }, function(courses) {
      this.courses = courses
    }.bind(this))
  })
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app='app'>
  <div ng-controller='firstCtrl as ctrl'>
    <ul>
      <li ng-repeat='course in ctrl.courses'>
        {{ course.code }} -
        <select ng-model='course.grade' ng-options='grade for grade in ctrl.availableGrades'></select>
      </li>
    </ul>
    <button ng-click=ctrl.save(ctrl.courses)>Save</button>
  </div>
  <div ng-controller='secondCtrl as ctrl'>
    <ul>
      <li ng-repeat='course in ctrl.courses'>
        {{ course.code }} -
        <select ng-model='course.grade' ng-options='grade for grade in ctrl.availableGrades'></select>
      </li>
    </ul>
  </div>
</div>
  • 0
    Не могу реализовать это так, потому что база данных немного сложнее. Возможно я не объяснил это должным образом в вопросе. База данных представляет собой систему планирования курса для университета. Таким образом, есть пользователи, у каждого пользователя есть разные годы, в которые вы размещаете курсы. Таким образом, курсы - это все курсы, предлагаемые в университете, и поэтому они не могут иметь оценочную собственность, поскольку оценка является персональной для каждого студента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню