2016-06-01 10 views
0

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".

Antwort

1

die Daten in den Objekten gespeichert Zugriff auf die Sie sich beziehen, können Sie entweder den Zugriff es wie folgt aus:

grade.id 

oder wie diese

grade['id'] 

Wenn Sie unsicher sind, ob ein Objekt enthält jede gegebene Eigenschaft, können Sie überprüfen, wie folgt:

grade.hasOwnProperty('id') 

Wenn Sie nur zur Konsole zu loggen wollen Inhalt des Objekts, können Sie es wie folgt tun:

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

Hope this beantwortet Ihre Frage

+0

, 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

+0

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? –

+0

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

0

Warum Sie es so kompliziert machen - ctrl.save(ctrl.courses) hat alle Informationen, die gespeichert werden müssen.

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

Kann es nicht so implementieren, da die Datenbank ein wenig komplizierter ist. Vielleicht habe ich es in der Frage nicht richtig erklärt. Die Datenbank stellt ein Kursplanungssystem für z.B. eine Universität dar. Es gibt also Benutzer, jeder Benutzer hat unterschiedliche Jahre, in denen Sie Kurse belegen. Die Kurse sind also alle Kurse, die an der Universität angeboten werden, und können daher keine Noten besitzen, da die Note für jeden Studenten persönlich ist. – Johanna