2016-06-01 2 views
0

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

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

Год: ID, UserID, курсы {courseid, класс,}

Курс: идентификатор, имя, кредиты и т.д.

Я сумел отправить информацию 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 = {идентификатор: 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) 
} 

EDIT

В файле с именем app.js VM к контроллеру, как и выбрать, какой контроллер использовать:

(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, называет приложение-сервис/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; 

} 

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

ответ

1

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

grade.id 

или как это

grade['id'] 

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

grade.hasOwnProperty('id') 

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

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

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

+0

что, к сожалению, не работает. класс получает идентификатор свойства, он получает свойство с именем так же, как и идентификатор курса, который я пытаюсь изменить. Таким образом, я не могу получить доступ к нему с помощью id, так как он изменяется в зависимости от того, какой курс я хочу изменить. Только консоль регистрирует его, потому что я хочу видеть содержимое atm, поэтому я могу выяснить, как продолжить. @Stian – Johanna

+0

Тогда я не уверен, понимаю ли я вашу проблему на самом деле? Появилось, поскольку вы просто хотели использовать некоторую информацию, хранящуюся в объекте? –

+0

Я хочу использовать информацию в объекте, но если вы посмотрите на консольный журнал в начале, вы увидите, что информация хранится таким образом, что я не могу использовать ie grade.id, чтобы получить его, поскольку свойство - это класс.574d8ce6bfb4ea470a2e10c7, где число соответствует идентификатору курса, который я хочу изменить в базе данных. Поэтому я хочу извлечь как 574d8ce6bfb4ea470a2e10c7, так и 3 из класса. @Stian – Johanna

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

Невозможно реализовать его так, потому что база данных немного сложнее. Возможно, я не объяснил это правильно в вопросе. База данных представляет собой систему планирования курсов, то есть университет. Таким образом, есть пользователи, каждый пользователь имеет разные годы, в которые вы размещаете курсы. Таким образом, курсы - это все курсы, предлагаемые в университете, и поэтому они не могут обладать имуществом класса, поскольку для каждого ученика он является личным. – Johanna

Смежные вопросы