将多个复选框提交到 firebase

Submit multiple checkbox to firebase

我正在使用 Angularfire,我想通过多个复选框来保存数据。

HTML

<form role="form" ng-submit="addTask(task)">
  <label class="checkbox-inline" ng-repeat="(key, value) in students">
    <input type="checkbox" id="{{key}}" value="{{key}}" ng-model="task.student[value.name]">{{value.name}}
  </label>
 <button type="submit">Submit</button>
</form>

JS

var ref = new Firebase(FURL);
var fbTasks = $firebaseArray(ref.child('tasks'));

$scope.addTask = function(task) {
    fbTasks.$add(task);
  }

这是结果

student
 --Alison Kay: true
 --Jessica Cook:false
 --John Smith: true
 --Kevin Hunt: true

我的问题是有什么方法可以像这样保存它们吗?

student
--(key)
  --name:Alison Kay
  --checked: true
--(key)
  --name:Jessica Cook
  --checked: false
--(key)
  --name:John Smith
  --checked: true
--(key)
  --name:Kevin Hunt
  --checked: true

我拼凑了一个粗略的example PLNKR to demonstrate one way to do this by extending the AngularFire services

请注意,文档指出:

These techniques should only be attempted by advanced Angular users who know their way around the code.


解决方案

您可以创建一个扩展 $firebaseObject 的工厂,并添加一个使用 .push() 为新任务生成新密钥的方法 .addTask()

工厂:

app.factory("TaskList",function($rootScope, $q, fbUrl, TaskListFactory){
  return function(studentKey){
    var ref = new Firebase(fbUrl+'/tasks/'+studentKey);
    return new TaskListFactory(ref);
  }
});

app.factory("TaskListFactory",function($firebaseObject, $q, fbUrl, $rootScope){
  return $firebaseObject.$extend({
    addTask: function(name, checked){
      // use push to generate a new key, set `name` and `checked`
      this.$ref().push({name: name, checked: checked}, function(error){
        if(!error){
          console.error(error);
        } else {
          console.log("Pushed new task.");
        }
      });
    }
  });
});

控制器:

注意:我使用了模拟对象。我无法解码您的数据结构,并采用了最佳猜测方法。

app.controller('HomeController',function($scope,fbUrl, $firebaseObject, TaskList) {
  // create mock student and task
  $scope.students = {tester: {name: 'tester'} };
  $scope.task = {tester: {name: 'test this'}};
  var taskList = new TaskList('student123');
  // get tasks list for debug:
  var tasksRef = new Firebase(fbUrl+'/tasks');
  $scope.tasks = $firebaseObject(tasksRef);

  $scope.addTask = function(task) {
    console.debug(task);
    taskList.addTask('Tester McGee', task.student['tester']);
  }

});

结果(<firebaseUrl>/tasks):

{
  "$id": "tasks",
  "$priority": null,
  "student123": {
    "-JoMxWoX0tQrGtdP6Qvm": {
      "checked": true,
      "name": "Tester McGee"
    }
  }
}

同样,这里的重点是工厂,而不是数据结构。我示例中的表单数据没有意义。

希望对您有所帮助。