Javascript 将主题添加到已拍摄列表中
我正在创建一个离开证书积分计算器,这是一个SPA网站,用户在其中勾选一个复选框,如果他们选择了主题,并输入他们收到的分数和他们选择的级别 我已经完全实现了界面以及所有的计算功能,但我正在努力寻找一种简单的方法,根据是否勾选复选框,将主题添加到一个新数组(称为takenSubjects) 到目前为止,界面就是这样的 我想把分数作为一个字符串(然后转换成正确的分数)。我还需要在水平(单选按钮),这也将有助于计算点。最后是Take(复选框)布尔值,它将决定是否将主题添加到要计算到总分的数组中 我没有大量的angularJS经验,但我正在使用一个工厂来保存我的功能。这是我到目前为止所使用的JavascriptJavascript 将主题添加到已拍摄列表中,javascript,angularjs,twitter-bootstrap,checkbox,user-input,Javascript,Angularjs,Twitter Bootstrap,Checkbox,User Input,我正在创建一个离开证书积分计算器,这是一个SPA网站,用户在其中勾选一个复选框,如果他们选择了主题,并输入他们收到的分数和他们选择的级别 我已经完全实现了界面以及所有的计算功能,但我正在努力寻找一种简单的方法,根据是否勾选复选框,将主题添加到一个新数组(称为takenSubjects) 到目前为止,界面就是这样的 我想把分数作为一个字符串(然后转换成正确的分数)。我还需要在水平(单选按钮),这也将有助于计算点。最后是Take(复选框)布尔值,它将决定是否将主题添加到要计算到总分的数组中 我没有
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();
});
factory.getSubjects=函数(){
返回主题;
};
/*
factory.getTakenSubjects=函数(){
回来
};
factory.getGrade=函数(){
范围、主题、推动(
{
等级:$scope.newGrade.grade;
});
}
factory.total=功能(科目、级别、等级){
var合计=0;
对于(var i=0;i0){//如果科目是数学,并且他们得到了分数,那么再加25分
结果+=25;
}
}否则,如果(级别==“较低”){
结果=较低的RadeTopoints(等级);
}{//Lead是基础
如果(subject==“Mathematics”| | subject==“Irish”){//只有两个科目允许此选项,请选中它。
结果=foundGradeToPoints(等级);
}
}
返回结果;
};
factory.foundationGradeToPoints=功能(等级){
道岔(坡度){
案例“A1”:
返回20;
案例“A2”:
返回15;
案例“B1”:
返回10;
案例“B2”:
返回5;
}
返回0;
};
factory.lowerGradeToPoints=功能(等级){
道岔(坡度){
案例“A1”:
返回60;
案例“A2”:
返回50;
案例“B1”:
返回45;
案例“B2”:
返回40;
案例“B3”:
返回35;
案例“C1”:
返回30;
案例“C2”:
返回25;
案例“C3”:
返回20;
案件“D1”:
返回15;
案件“D2”:
返回10;
案例“D3”:
返回5;
}
返回0;
};
factory.higherGradeToPoints=功能(等级){
道岔(坡度){
案例“A1”:
返回100;
案例“A2”:
返回90;
案例“B1”:
返回85;
案例“B2”:
返回80;
案例“B3”:
返回75;
案例“C1”:
返回70;
案例“C2”:
返回65;
案例“C3”:
返回60;
案件“D1”:
返回55;
案件“D2”:
返回50;
案例“D3”:
返回45;
}
返回0;
};
*/
返回工厂;
})
.controller('SimpleController',函数($scope,simpleFactory){
$scope.subjects=simpleFactory.getSubjects();
});
您应该使用ng repeat在html视图中构建主题列表。
以及使用ng模型(在初始化时设置)和一些
<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>
在工厂中,一种方法可以将某些内容设置/存储到后端或其他类型的存储中,以便getter能够获取这些内容。如果更改应用程序体系结构,可能会更好。也就是说,更改工厂并向控制器添加更多。 我会给你一些提示,但不是整个应用程序的代码。你需要自己解决这个问题 以下是您可能需要遵循的一些步骤: 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(subject)
例如,您的html应该如下所示:
<input type="checkbox" ng-model="subject.taken"> //must be in scope of SimpleController
请记住-您的ng模型应该与控制器中的对象键相同
而这正是你的出发点。你不需要完全遵循这一点。但这应该会有帮助强>
需要注意的一点是:确保定义因子的语法有效。下面是我如何定义工厂的:
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**
您将需要将模型附加到che
.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**