Угловое связывание не работает должным образом с ngInfiniteScroll
По сути, у меня есть временная шкала с записями, которая является $ firebaseArray, и любое изменение этого массива связывается должным образом. Но когда я хочу связать любые другие данные, он связывается только тогда, когда ngInfiniteScroll пытается получить больше данных из firebase, поэтому только когда я прокручиваю вниз.
В коде ниже я звоню {{getMoreDetails()}}
и эти данные связываются, когда первый набор данных извлекается с помощью ngInfiniteScroll, но как только он загружается, связывание прерывается и связывается снова только при прокрутке.
Мои проблемы здесь:
- Был ли ngInfiniteScroll работать таким образом?
- Есть ли обходной путь в этом сценарии?
стек:
"firebase": "2.4.2","angularfire": "~1.2.0","firebase-util": "0.2.5","ngInfiniteScroll": "1.2.2"
timeline.html
<div ng-controller="TimelineController">
<section class="entrys main-content" infinite-scroll="posts.scroll.next(3)" infinite-scroll-distance="0.3">
<div class="inner">
<div ng-repeat="post in filteredPostsResults = (posts | filter:postIdFilter)">
<article class="entry">
<img ng-if="post.sourceType=='IMAGE'" data-ng-src="{{getPostData(post)}}"/>
<div class="entry-info">
<h3><div ng-bind-html="post.description | emoticons"></div></h3>
<small>posted on <time>{{getDateInFormat(post.createdAt)}}</time></small>
{{getMoreDetails()}}
</div>
</article>
</div>
</div>
</section>
</div>
timeline.js
(function (angular) {
"use strict";
var timeline = angular.module('myApp.user.timeline', ['firebase', 'firebase.utils', 'firebase.auth', 'ngRoute', 'myApp.user.timelineService']);
timeline.controller('TimelineController', [ '$scope', '$routeParams', 'TimelineService', '$publisherServices', '$securityProperties', function ($scope, $routeParams, TimelineService, $publisherServices, $securityProperties) {
if (!$scope.posts){
$scope.posts = TimelineService.getPosts($routeParams.userId);
}
$scope.posts.$loaded(function(result) {
$scope.isPostsLoaded = true;
});
$scope.getMoreDetails = function() {
console.log("LOGGED ONLY WHEN SCROLLING");
return $publisherServices.getDetails();
};
$scope.getPostData = function(post) {
if (!post.dataUrl){
post.dataUrl = $publisherServices.getAwsFileUrl(post.fileName);
}
return post.dataUrl;
};
$scope.postIdFilter = function(post) {
if ($routeParams.postId){
if (post.$id == $routeParams.postId) return post;
} else { return post; }
};
$scope.getDateInFormat = function(timestamp){
var date = new Date();
date.setTime(timestamp);
return date;
};
}]);
})(angular);
timelineService.js
(function (angular) {
"use strict";
var timelineService = angular.module('myApp.user.timelineService', []);
timelineService.service('TimelineService', ['$routeParams', 'FBURL', '$firebaseArray', function ($routeParams, FBURL, $firebaseArray) {
var posts;
var currentUserIdPosts;
var postsRef;
var self = {
getPosts: function(userId){
if (!posts || userId != currentUserIdPosts){
currentUserIdPosts = userId;
postsRef = new Firebase(FBURL).child("posts").child(userId);
var scrollRef = new Firebase.util.Scroll(postsRef, "createdAtDesc");
posts = $firebaseArray(scrollRef);
posts.scroll = scrollRef.scroll;
}
return posts;
}
}
return self;
}]);
})(angular);
1 ответ
Я предполагаю, что вы хотите, чтобы данные поста обновлялись при изменении данных из вашей Firebase.
Когда изменения Firebase применяются к вашей области, кажется, что она не запускает цикл дайджеста, поэтому вам, вероятно, придется делать это вручную каждый раз, когда вы получаете обновления от Firebase.
Взгляни на $$updated
в $firebaseArray.$extend
( см. документы).
// now let's create a synchronized array factory that uses our Widget app.factory("WidgetFactory", function($firebaseArray, Widget) { return $firebaseArray.$extend({ // override the update behavior to call Widget.update() $$updated: function(snap) { // we need to return true/false here or $watch listeners will not get triggered // luckily, our Widget.prototype.update() method already returns a boolean if // anything has changed return this.$getRecord(snap.key()).update(snap); } }); });
Надеюсь, это поможет.