Я использую стек 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-коду. Отправка новой информации в базу данных имеет одинаковую структуру, но включает в себя объект, который должен быть отправлен с целым временем. В предыдущих случаях объект был легко построен, но теперь мне нужно отправить код курса, год-идентификатор и оценку, и я пытаюсь сделать это, используя флажок и выбор, поэтому три значения, но на двух "носителях".
для доступа к данным, хранящимся в объектах, на которые вы ссылаетесь, вы можете либо получить к нему доступ, как это:
grade.id
или как это
grade['id']
Если вы не уверены, что объект содержит какое-либо заданное свойство, вы можете проверить следующее:
grade.hasOwnProperty('id')
Если вы просто хотите войти в консоль для содержимого содержимого объекта, вы можете сделать это следующим образом:
console.log( JSON.stringify( grade ) );
Надеюсь, что это ответ на ваш вопрос
Почему вы делаете это так сложно - 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>