如何使用Node.js, Angular.js和Firebase实现无限滚动
How to implement Infinite Scrolling using Node.js, Angular.js and Firebase?
UPDATE 8:
代码:
<% include ../partials/header %>
<script src="https://www.gstatic.com/firebasejs/3.5.2/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/firebase-util/0.2.5/firebase-util.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.2/angular.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/1.1.4/angularfire.min.js"></script>
<script>
var config = {
info
};
firebase.initializeApp(config);
var fb = firebase.database().ref("posts/fun");
var app = angular.module('app', ['firebase']);
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
$scope.data = [];
var _start = 0;
var _end = 4;
var _n = 5;
$scope.getDataset = function() {
fb.orderByChild('id').startAt(_start).endAt(_end).limitToLast(_n).on("child_added", function(dataSnapshot) {
$scope.data.push(dataSnapshot.val());
console.log("THE VALUE:"+$scope.data);
});
_start = _start + _n;
_end = _end + _n;
};
$scope.getDataset()
});
// Compile the whole <body> with the angular module named "app"
angular.bootstrap(document.body, ['app']);
</script>
<div class ="containerMarginsIndex">
<div ng-controller="ctrl">
<div class="fun" ng-repeat="d in data">
<h3 class="text-left">{{d.title}}</h3>
<div class = "postImgIndex">
<a href="details/{{d.id}}" target="_blank">
<img class= "imgIndex" ng-src="/images/uploads/{{d.image}}" >
</a>
</div>
<div class="postScore">{{d.upvotes - d.downvotes}} HP</div>
</div>
</div>
</div>
<% include ../partials/footer %>
:
好的,我已经重新设计了我的Firebase数据库架构并更改了Firebase规则。
我现在确定Firebase函数返回一个值(它被记录在控制台中)。
但是我仍然得到以下错误:
这个HTML:
<div class="fun" ng-repeat="d in data">
<h3 class="text-left">{{d.title}}</h3>
<div class = "postImgIndex">
<a href="details/{{d.id}}" target="_blank">
<img class= "imgIndex" ng-src="/images/uploads/{{d.image}}" >
</a>
</div>
<div class="postScore">{{d.upvotes - d.downvotes}} HP</div>
</div>
在渲染后被替换为:
<!-- ngRepeat: d in data --> == $0
我做错了什么?
它没有显示在您的视图中,因为您在$scope
上没有任何东西,并且您没有使用{{}}
来插入您的数据。查看以下更改:
将data
分配给$scope
变量以在视图中使用:
$scope.data = [];
var _start = 0;
var _end = 4;
var _n = 5;
var getDataset = function() {
fb.orderByChild('time').startAt(_start).endAt(_end).limitToLast(_n).on("child_added", function(dataSnapshot) {
$scope.data.push(dataSnapshot.val());
});
_start = _start + _n;
_end = _end + _n;
和你的视图,使用ngRepeat
和{{}}
来插入:
<div class ="containerMarginsIndex">
<div class="fun" ng-repeat="d in data">
<h3 class="text-left">{{d.title}}</h3>
<div class = "postImgIndex">
<a href="details/{{post.id}}" target="_blank">
<img class= "imgIndex" src="/images/uploads/{{post.image}}" >
</a>
</div>
<div class="postScore">({{d.upvotes - d.downvotes}}) HP</div>
</div>
</div>
在控制器中添加滚动监听器。函数more
确实不存在,但是你有一个$scope.more
方法。
app.controller('ctrl', function ($scope, $firebaseArray, $timeout) {
// ORDERED BY TIME:
var ref = firebase.database().ref("posts/fun");
var scrollRef = new Firebase.util.Scroll(ref, "time");
$scope.posts = $firebaseArray(scrollRef);
scrollRef.scroll.next(5);
// AS DATA APPEARS IN DATABASE ORDERED BY TIME:
ref.once('value', function(snap) {
$scope.rawdata = snap.val();
$scope.$apply();
});
$scope.more = function() {
scrollRef.scroll.next(5);
};
// Add scroll listener
window.addEventListener('scroll', function() {
if (window.scrollY === document.body.scrollHeight - window.innerHeight) {
$scope.$apply($scope.more);
}
});
});
请注意,我在$scope.$apply
中调用$scope.more
,以便在调用结束时对范围进行消化。实际上,窗口滚动事件的JS监听器已经不在Angular的生命周期中了,所以我们需要手动设置$digest
作用域,以便Angular更新所有的监听器和HTML。如果你想了解更多关于$scope.$apply
的信息,请在网上搜索。
关于你的第一个问题
你的angular应用没有启动,因为angular从未初始化过。为此,您需要同步加载它并使用ng-app
指令,或者如果您不想更改代码中的任何内容,您可以简单地在模块和控制器定义之后添加这些行:
// Compile the whole <body> with the angular module named "app"
angular.bootstrap(document.body, ['app']);
你需要包含$scope.$apply()
,因为滚动事件在Angular的上下文中执行。
事件监听器也应该在控制器内部,以便more
函数的作用域是可访问的。
这是一个更新的小提琴:
https://jsfiddle.net/xue8odfc/2/我想说Angular没有解决{{post.image}}
等问题是由于你引用的库之间的不兼容。我建议使用工作目录中的版本进行测试:
<script src="https://cdn.firebase.com/js/client/2.0.3/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/firebase-util/0.2.5/firebase-util.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.min.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/1.1.4/angularfire.min.js"></script>
- HTML中两种JS实现之间的差异
- 使用 JavaScript/Node.js 实现插件架构
- 如何使用结构 JS 实现对比度
- 通过JS实现面板可见性
- 我怎样才能用 Require.js 实现 TinyMCE
- 使用Skrollr.js实现水平效果
- 基本 JS 实现基本数学来转换值
- Prototypejs $super的原生 JS 实现
- 使用 JS 实现 HTML 最小化器插件
- 分析JS实现中的XLS(Excel)文件
- 如何使用paper.js实现多点触摸交互
- 如何使用sinon.js实现mock/stub回调函数
- React.js-实现组件排序
- 是否可以用Ext.js实现可移动工具栏,如果可以,如何用我的代码实现
- 棘轮与角js实现
- JavaScript/List.js:实现模糊搜索
- 尝试使用cucumber.js实现页面对象模型时出错
- 如何使用Thinktecture.IdentityServer.v2和Node.js实现WS-Federation
- 使用Node.js实现网页自动化
- 使用MVC/Backbone.js实现复合模式