extrahieren Ich verwende den MEAN-Stack und versuche, Informationen aus einem Objekt zu extrahieren, aber die Attribute ändern sich abhängig von vielen Faktoren, so dass sie nicht aufgerufen werden können. Gibt es eine Möglichkeit, die Informationen auf andere Weise zu erhalten? Die Daten werden verwendet, um verschiedene Dinge in meiner Monogdb zu aktualisieren.Inhalt aus Objekt, Nodejs
Einfache Info über meine Datenbank: 3 Sammlungen. Benutzer, Jahre, Kurse.
Jahr: id, Benutzer-ID, Kurse {courseid, grade,}
Kurs: ID, Name, Kredite usw.
Ich habe es geschafft, die Informationen an die NodeJS Datei zu senden, kann aber nicht mach irgendetwas damit. Unten ist das Ergebnis des Konsolenprotokolls, das ich von den Informationen mache. Wie bekomme ich die Informationen aus dem Objekt heraus, damit ich meine Datenbank aktualisieren kann?
Ergebnis aus dem Protokoll
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.
home/index.html
Unten enthält nur das Formular aus. Die Variable year.XXX iteriert über ein Jahr (Aus der Datenbank abgerufen).
year.course = {id: XX, Note: YY}
thecourse iteriert über alle Kurse in der Datenbank kursspezifische Informationen zu erhalten.
vm.change ist die Variable, die an die Steuerung gesendet wird.
<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
In einem app.js vm genannt Datei als Controller und die Controller zu verwenden wählen:
(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' }
});
}
Wenn die HTML geladen wird, sammelt der Controller einige Informationen aus der Datenbank, die auf den meisten Teilen der Seite verwendet werden.
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;
});
}
Alle wird in der Initcontroller oben ist so ziemlich das gleiche, so werde ich den Prozess für einen von ihnen zeigen, YearSevice.GetAll, ruft 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);
}
mit dem $ http.get wir über den Server zu einem serverseitigen Controller gehen, 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 ruft die serverseitigen Dienste auf: 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;
}
Und die Sammlung wird den ganzen Weg zum HTML-Code zurückgegeben. Das Senden neuer Informationen an die Datenbank hat die gleiche Struktur, enthält jedoch ein Objekt, das die ganze Zeit gesendet werden soll. In früheren Fällen war das Objekt einfach zu konstruieren, aber jetzt muss ich Kurscode, Jahres-ID und Note senden und versuche es mit einer Checkbox und einer Auswahl, also drei Werten, aber in zwei "Trägern".
, das funktioniert leider nicht. Klasse bekommt eine Property ID, sie bekommt eine Property die genauso heißt wie die ID des Kurses, den ich versuche die Note zu ändern. Also kann ich nicht mit ID darauf zugreifen, da es sich je nachdem ändert, welchen Kurs ich ändern möchte. Nur Konsole loggen Sie es, weil ich den Inhalt atm sehen möchte, damit ich herausfinden kann, wie man fortfährt. @Stian – Johanna
Dann bin ich mir nicht sicher, ob ich verstehe, was dein Problem eigentlich ist? Erschienen, als Sie nur einige Informationen im Objekt gespeichert haben wollten? –
Ich möchte die Informationen im Objekt verwenden, aber wenn Sie das Konsolenprotokoll am Anfang betrachten, sehen Sie, dass die Informationen in einer Weise gespeichert werden, die ich nicht verwenden kann, dh grade.id, um es seit der Eigenschaft zu erhalten ist grade.574d8ce6bfb4ea470a2e10c7, wobei die Nummer der ID des Kurses entspricht, den ich in der Datenbank ändern möchte. Also möchte ich sowohl 574d8ce6bfb4ea470a2e10c7 als auch 3 aus dem Klassenobjekt extrahieren. @Stian – Johanna