0

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

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

Это то, что интерфейс выглядит до сих пор.

http://i62.tinypic.com/28rjg2d.png

Я хочу взять в классе в виде строки (которая затем преобразуется в правильное количество точек). Мне также нужно будет взять уровень (переключатели), который также поможет рассчитать очки. И, наконец, взятый (флажок) логический, который будет решать, следует ли добавлять субъекта к массиву, который будет вычисляться в итоговые точки.

У меня нет огромного опыта работы с угловымJS, но я использую фабрику для хранения своих функций. Вот Javascript, который у меня есть до сих пор.

factory.getSubjects = function() { 
      return subjects; 
     }; 
    /* 
     factory.getTakenSubjects = function() { 
      return 
     }; 

     factory.getGrade = function() { 
      scope.subjects.push(
      { 
       grade: $scope.newGrade.grade; 
      }); 
     } 

     factory.total = function (subjects, levels,grades) { 
      var total=0; 
      for(var i=0;i<subjects.length;i++){ 
       total+=gradeToPoints(subjects[i],levels[i],grades[i]); 
      } 
      return total; 
     }; 

     factory.gradeToPoints= function(subject,level,grade){ 
      var results = 0; 
      if(level==="Higher"){ 
       results = higherGradeToPoints(grade); 
       if (subject === "Mathematics" && results>0){//if the subject is maths and they have gotten points then add 25 more to it 
        results += 25; 
       } 
      }else if(level==="Lower"){ 
       results = lowerGradeToPoints(grade); 
      }else{//level is foundation 
       if(subject === "Mathematics" || subject === "Irish"){//only two subject allow for this option so check it. 
        results = foundGradeToPoints(grade); 
       } 
      } 
      return results; 
     };  

     factory.foundationGradeToPoints = function (grade) { 
      switch (grade){ 
       case "A1": 
        return 20; 
       case "A2": 
        return 15; 
       case "B1": 
        return 10; 
       case "B2": 
        return 5; 
      } 
      return 0; 
     }; 

     factory.lowerGradeToPoints = function (grade) { 
      switch (grade){ 
       case "A1": 
        return 60; 

       case "A2": 
        return 50; 

       case "B1": 
        return 45;  

       case "B2": 
        return 40;  

       case "B3": 
        return 35; 

       case "C1": 
        return 30; 

       case "C2": 
        return 25; 

       case "C3": 
        return 20; 

       case "D1": 
        return 15; 

       case "D2": 
        return 10; 

       case "D3": 
        return 5; 
      } 
      return 0; 
     }; 

     factory.higherGradeToPoints = function (grade) { 
      switch (grade){ 
       case "A1": 
        return 100; 

       case "A2": 
        return 90; 

       case "B1": 
        return 85; 

       case "B2": 
        return 80; 

       case "B3": 
        return 75; 

       case "C1": 
        return 70; 

       case "C2": 
        return 65; 

       case "C3": 
        return 60; 

       case "D1": 
        return 55; 

       case "D2": 
        return 50; 

       case "D3": 
        return 45; 
      } 
      return 0; 
     }; 
     */ 
     return factory; 
    }) 

    .controller('SimpleController', function($scope, simpleFactory) { 
      $scope.subjects = simpleFactory.getSubjects(); 
    }); 
+0

Вам нужно будет прикрепить модель к окну checkbox. Вы это сделали? – raneshu

+0

Возможно, вам понадобится добавить массив в область действия контроллера. –

+0

Добавьте массив к контроллеру, который вы используете при вызове методов обслуживания, например, фабрик, с контроллера для расчета материала. [Вдохновение] (http://plnkr.co/edit/WrK3UzIe5AlhekiCtF1h?p=preview) –

ответ

0

Вы должны были создать свой список тем в представлении html с помощью ng-repeat. и ваши checboxes использующих нг-модель (которые вы установили при инициализации) и некоторые

<div ng-controller="myCtrl1"> 
    <div ng-repeat="subject in subjects track by $index"> 
    <input type="checkbox" ng-model="subject.taken[$index] ng-change="setTaken(subject, $index, value)""/> 
    <span>{{subject.name}}</span> 
    </div> 
</div> 

Тогда в контроллере у вас есть метод setTaken, который может проходить принятый или не принятый на эту тему на завод-изготовителе. (Вы должны также осуществлять геттер для инициализации, используя час getTaken метод, который обновляет значение нг-модели, ng-model="subject.taken[$index])

$scope.setTaken= function(subject,$index, value){ 
    simpleFactory.setTaken(subject,value); 
} 

А на заводе метод, который устанавливает/хранит что-то с внутренним сервером или другого типа хранилище, чтобы ваш получатель мог его получить.

0

Возможно, вам лучше изменить архитектуру приложения. То есть, измените завод и добавьте больше в контроллер. Я дам вам несколько указателей, но не код для всего приложения. Вам нужно будет это понять.

Ниже приведены некоторые шаги, которые вы можете захотеть: 1) Добавить var takenSubjects =[]; в начало вашего завода. Это массив, в котором будут храниться предметы, которые вы взяли.

2) Включите функцию на вашем заводе, чтобы вы могли добавить объект с предметной информацией в свой массив. Функция должна выглядеть следующим образом:

factory.addTakenSubject = function(subject) { 
     takenSubjects.push(subject); 
    };] 

    //The objects you will be adding would be like this: - but don't worry about the object right now. 
    { 
    subject: 'Accounting, 
    taken: true, //or false..whichever 
    level: "ordinary" 
    gradeReceived: "A" 
    } 

3) Теперь вы можете прикрепить модели для всех полей в HTML. Вот пример того, как добавить модель в поле флажка. Это легко -

Чтобы проверить, есть ли флажок, вам необходимо прикрепить модель к флажку - в виде (html). Помните, что ваша фабрика не может взаимодействовать с представлением, поэтому вашему контроллеру необходимо будет захватить состояние флажка (true, если отмечено, false, если не отмечен), а затем вы можете назначить его SimpleFactory.addTakenSubject (субъект)

Так, к примеру, ваш HTML должен выглядеть следующим образом:

<input type="checkbox" ng-model="subject.taken"> //must be in scope of SimpleController 

Аналогично, для уровня (выше, обычный, фундамент), ваш HTML будет выглядеть следующим образом:

Помните - вы, вероятно, использовать нг-повтора в список вы HTML

------ Вы можете сделать остальные - в основном добавить html для остальных полей ввода. Вы, наверное, уже это сделали!

- 4) Затем вам нужно добавить функцию к контроллеру, которая захватывает значение принятого (которое будет истинным или ложным) и присваивает его переменной экземпляра на вашем заводе.

Так как:

.controller('SimpleController', function($scope, simpleFactory) { 
     $scope.subject={subject:"", taken:false, level:"", gradeReceived:""};//taken is defaulted to false 
     $scope.add = function() { 
     simpleFactory.addTakenSubject($scope.subject);//$scope.subject will no 
     }); 
     }); 

Помните - ваша нг-модель должна быть такой же, как ключевой объект в контроллере.

И это в значительной степени, где вы начнете.Вам не обязательно следовать этому полностью. Но это должно помочь!

Одно слово предостережения: убедитесь, что ваш синтаксис для определения коэффициента является действительным. Вот как я бы определил фабрику:

 var app = angular.module('myApp', []); 
    app.factory('myFactory', [function(){ 
     var takenSubjects = []; 
     return{ 
      addTakenSubject: function() { 
       takenSubjects.push(subject); 
      } 
     } 
    }]); 
    //this is only one function. You can add more key value pairs in the return object. 
    //**remember - factories return objects** 
Смежные вопросы