【发布时间】:2015-05-15 02:22:23
【问题描述】:
我有一个 firebaseObject (MyFirebaseService.getCurrentUser()) 绑定到 $scope.user。 绑定成功后,我循环该对象以查看该对象是否包含等于某个值($stateParams.id)的“associatedCourseId”。如果是,则 $scope.finishLessonCount 计数。问题是,当我通过其他页面或 firebase 内部的 firebaseObject(即绑定用户)添加新对象时,finishLessonCount 值不会像我期望的 3 路绑定那样改变。我需要刷新页面以查看 finishLessonCount 反映真实值。怎么了?当我将更多的finishedLessons 添加到firebaseObject 中时,我希望使用比较函数来改变finishLessonCount。请看下面的代码:
MyFirebaseService.getCurrentUser().$bindTo($scope, "user").then(function(){
for (var key in $scope.user.finishedLessons) {
if ($scope.user.finishedLessons.hasOwnProperty(key)) {
if ($scope.user.finishedLessons[key].associatedCourseId == $stateParams.id) {
$scope.finishLessonCount++;
}
}
};
console.log ($scope.finishLessonCount);
});
UPDATE 1 根据@Kato 解决方案: 我决定使用 Extending firebaseOject 的方式来解决这个问题。但是,它仍然没有。我没有在这里使用工厂来简化事情,因为我需要传入 courseId 来进行操作。这是我的代码:
function countLessons(lessons, courseId) {
var count = 0;
for(var key in lessons) {
if( lessons[key].associatedCourseId == courseId) {
count++;
}
}
return count;
}
var UserWithLessonsCounter = $firebaseObject.$extend({
$$updated: function(snap) {
var changed = $firebaseObject.prototype.$$updated.call(this, snap);
this.lessonCount = countLessons(this.finishedLessons, $stateParams.id);
}
});
var refTemp = new Firebase($rootScope.baseUrl + "users/" + $rootScope.userId);
var userTemp = new UserWithLessonsCounter(refTemp);
userTemp.$bindTo($scope, "userTemp").then(function(){
console.log($scope.userTemp);
});
userTemp.$watch(function() {
console.log("Does this run at all? " + $scope.userTemp.lessonCount);
});
我更新了用户对象,课程计数值没有改变,除非我刷新页面。 $watch 中的 console.log 根本没有运行。怎么了?
【问题讨论】:
-
很可能,您应该将课程存储在in their own path,而不是在用户节点中囤积数据。这也意味着您应该使用 $firebaseArray 而不是 $firebaseObject 来显示该数据。
标签: javascript angularjs data-binding firebase