我想将snapshot.val()分配给$ scope variable $ scope.pending并将其绑定到ng-repeat列表

时间:2016-05-21 08:55:32

标签: angularjs firebase

     firebase  logged data

Object {information: "way", status: "pending", title: "killa"}
controllers.js:43 Object {information: "way", status: "pending", title: "killa"}
controllers.js:42 Object {information: "way", status: "pending", title: "killa2"}
controllers.js:43 Object {information: "way", status: "pending", title: "killa2"}

我似乎无法获取从firebase获取的项目列表,但我能够记录它。

<ion-list  ng-controller="pendingTasksCtrl">
              <ion-item ng-click="task.completed = !task.completed" class="item-icon-right"  ng-repeat="p in pending">{{p.title}}{{p.information}}
                <i class="icon ion-ios-arrow-left"></i>
                <ion-option-button class="ion-trash-a" ng-click="removeItem($index,1)">
                </ion-option-button>
                 <ion-option-button ng-controller="editTaskCtrl" class="ion-edit" ng-click="modal.show()">
                 </ion-option-button>
               </ion-item>
                </ion-list>

我想将快照分配给$ scope.pending并将其绑定在前端。但我得到一个未定义的错误

.controller('pendingTasksCtrl', function($scope,$firebaseArray,$firebaseObject,$rootScope,$ionicModal)
{

  var task = "AllTasks";
  var id =0;

            var itemref = new Firebase("https://tasksbylima.firebaseio.com/");
            //$scope.items = $firebaseArray(itemref);
            //var status = "completed";

            $scope.test = function()
            {
            itemref.orderByChild("status").equalTo("pending").on("child_added", function(snapshot)
             {
               $scope.pending = snapshot.val();

                console.log(snapshot.val());
                console.log(pending);

          //  console.log("**************find me "+itemref.orderByChild("status").equalTo("task").on("child_added"));
          });

}
})

3 个答案:

答案 0 :(得分:0)

您正在测试console.log(pending),但它应该是console.log($scope.pending)pending未定义,因为您没有任何具有该名称的单独变量。

修改

根据你的评论,我猜你丢失了对数组的引用。当您使用=替换$scope中的当前数据时,您正在指定一个新数组,并且视图仍然引用了第一个数组。我看到两种可能的解决方案:

解决方案1 ​​

用对象包裹数组。

$scope.model = {
    pending: []
}

在视图中:将pending更改为model.pending

在控制器中:使用$scope.model.pending代替$scope.pending。这样,对数组的引用不会改变,因为它是对象的属性。

解决方案2

而不是使用=使用splicefor

在控制器的开头添加数组初始化:

$scope.pending = [];

然后,将$scope.pending = snapshot.val()更改为:

var data = snapshot.val();
$scope.pending.splice(0)  // this will empty the array 

// This will insert new elements
for(var i = 0; i < data.length; i++) {
    $scope.pending.push(data[i]);
}

答案 1 :(得分:0)

我遇到了与Firebase和Angular 2类似的问题。.on函数的问题是它们在AngularJS中以某种方式松散与this的连接,在AngularJS中我想可能存在类似的问题与$scope

试试这个:

  itemref.orderByChild("status").equalTo("pending").on("child_added", function(snapshot)
         {
           $scope.pending = snapshot.val();

            console.log(snapshot.val());
            console.log($scope.pending);
      }.bind($scope));

现在它应该可以在您的HTML /前端中使用。

答案 2 :(得分:0)

var itemref = new Firebase("https://tasksbylima.firebaseio.com/task");
   var taskref = itemref.orderByChild("status").equalTo(true);
     taskref.on("value", function(response) {
     $scope.filterTasks = response.val();

完美无缺