javascript - 循环通过 $id 从 Firebase 后端生成自定义的唯一页面数据

标签 javascript angularjs firebase angularfire

我正在使用 AngularJS 和 Firebase 创建一个博客。 我遇到的问题是,当用户单击后端写入 firebase 的特定博客文章的链接时,我试图成功呈现唯一的页面数据。

我的 Firebase 数据位于“https:ngblogapp.firebaseio.com/posts”

这是我的图书馆的视觉效果 enter image description here

我正在使用 ng-repeat="post in posts"渲染页面链接,其中 posts 指的是 firebase 库。 这是一个视觉效果。 enter image description here

当我点击其中一个链接时,我会进入一个具有唯一 url id 的页面,例如 ''' http://localhost:7000/#/post/-K0T3PqoCBVygt_LCCHF ''' 但唯一的页面显示的数据是这样的 enter image description here

让我带你进入我的 JavaScript。

var app=angular.module('myBlogApp',
[
'ngRoute',
'app.controllers',
'app.directives',
'firebase'
])
.constant('FBURL', "https://ngblogapp.firebaseio.com/posts") //fburl
.config(['$routeProvider', function($routeProvider){
    $routeProvider.when('/',{
        templateUrl: '../views/posts.html',
        controller: 'postController'
    }).when('/post/:postId',{
        templateUrl:'../views/singlepost.html',
        controller: 'postController'
    }).when('/page/:postId',{
        templateUrl:'../views/page.html',
        controller: 'postController' //'PageController'
    }).when('/create',{
        templateUrl:'../views/createaPost.html',
        controller:'postController'
    }).otherwise({
      redirectTo: '/'
    });
}
]);
app.factory("Blog",["$firebaseArray","$routeParams",   function($firebaseArray, $routeParams){

var ref = new Firebase("https://ngblogapp.firebaseio.com/posts");//  FIREBASE OBJ  
var blogPostsArray = $firebaseArray(ref);
  return{

    id: $routeParams.postId,

    allPosts: blogPostsArray, // all fb objects

    addPost: function(newpost){
      newpost.datetime = Firebase.ServerValue.TIMESTAMP;
      return blogPostsArray.$add(newpost); //push to array
    }

};

}]);



app.controller('postController',["$scope",     "$location","$routeParams","Blog","FBURL", "$firebaseObject"    ,function($scope,$location,$routeParams,Blog,FBURL,$firebaseObject){

$scope.posts = Blog.allPosts; //All blog posts
var postId = $routeParams.postId;

if(postId){
$scope.selectedPost = getPost(postId);
}

function getPost(postId){
var ref = new Firebase(FBURL + postId);
return $firebaseObject(ref);
}

$scope.addPost = function(newpost){
Blog.addPost($scope.newpost);
//$location.path('/'); //redirects to home page
console.log(newpost);
console.log($scope.posts); // all posts
$scope.newpost ={}; //reset the message
};

$scope.currentPost = function(postId){
Blog.getPost(postId);
console.log(postId);
};

}]);

在“postController”中,我有一个名为 getPost(postId) 的方法,它采用参数 postId。 我的postId被分配给一个routeParam,就像postId = $routeParams.id一样。

在我的 html 部分中,我循环遍历 posts.$id,如下所示:

<div class="container">
<div class="col-md-offset-9 col-md-3">
<!--span(class="glyphicon glyphicon-search" aria-hidden="true")-->
<input type="text" ng-model="searchPost" placeholder="Search"  class="form-control"/>
</div>
<article ng-repeat="post in posts | filter: searchPost | orderBy:  date:'medium' ">
<h1 class="page-header"><a ng-href="#/post/{{post.$id}}">{{post.title}}
    <h3>{{post.text | limitTo: 30}}{{post.text.length > 30? "...": ""}}         <i>{{post.datetime | date:short}}</i></h3></a></h1>
</article>
</div>

同样,这会在 url 上呈现 id,但会将我定向到一个时髦的对象

{"$id":"posts-K0T3PqoCBVygt_LCCHF","$priority":null,"$value":null}

我不知道什么是正确的 API 调用来获取对象的唯一 id 并使用 AngularFire 显示其内容。任何建议都会很棒。

最佳答案

我认为你只是缺少一个斜杠

var postId = $routeParams.postId;

基于https://docs.angularjs.org/api/ngRoute/service/ $routeParams 它返回一个不带斜杠的参数值对象

function getPost(postId){
    // FBURL + postId = ...firebaseio.com/posts-K0T3PqoCBVygt_LCCHF
    // FBURL + '/' + postId = ...firebaseio.com/posts/-K0T3PqoCBVygt_LCCHF
    var ref = new Firebase(FBURL + postId);
    return $firebaseObject(ref);
}

所以恕我直言,修复方法是new Firebase(FBURL + '/' + postId),但我无法测试它(或重现)。

关于javascript - 循环通过 $id 从 Firebase 后端生成自定义的唯一页面数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244595/

相关文章:

javascript - Angular - 仅在存在内容时显示 div

javascript - 第一次运行 Grunt build 时出错

javascript - firebase 函数属性 'data' 在类型 'Change<DataSnapshot>' 上不存在

firebase - *运行Gradle时出错:ProcessException:进程 “E:\Flutter\login_demo\android\gradlew.bat”异常退出:

javascript - 通过 html 和 javascript 上传远程服务器上的文件

javascript - 我在使用语义 ui react 下拉列表时得到 `Uncaught TypeError: _this.ref.querySelector is not a function`

javascript - require.js 依赖分析工具

javascript - $scope 变量直到第二次单击才更新(AngularJS/jQuery/Bootstrap 日期范围选择器)

javascript - 扩展/合并对象

firebase - 异步 new Vue() 等待初始身份验证