我使用firebase自动生成id将每个帖子存储在firebase中。让我们说-JBuEJXgILubWjxECjwj
然后我像这样查询帖子
Post.getPost($routeParams.postID); //snippet code
因此,当用户访问example.com/userid/-JBuEJXgILubWjxECjwj
时会显示内容。但我希望网址可读。
当用户访问example.com/userid/mystory
或example/userid/-JBuEJXgILubWjxECjwj
时会收到正确的帖子。
如何在网址中将id重命名为title?
更新
基本上,这就是我的数据存储在firebase中的方式
posts: {
randomID1: {
title: 'This is post 1'
},
randomID2: {
title: 'This is post 2
}
}
然后,我使用angularFire javascript api($ firebase)
进行查询$scope.post = $firebase(new Firebase.child('posts/').child($routeParams.postID))
我认为查询代码是正常的,我的数据存储方式如何将id转换为title。 任何想法?
答案 0 :(得分:2)
以下是如何将标题转换为URL slugs,然后查找Id(小提琴:http://jsfiddle.net/rvWhV/):
var posts = {
randomID1: {
title: 'This is post 1'
},
randomID2: {
title: 'This is post 2'
}
};
// find id from slug in posts
function getPostId(slug) {
for(var i in posts) {
// match id or slug so both URL forms are supported
if(i === slug || posts[i].slug === slug) {
return i;
}
}
return null;
}
// create slugs and add them to post objects
for(var i in posts) {
var p = posts[i];
// create slug by replacing characters in title. TODO: handle posts with same title, maybe by appending a number
p.slug = p.title.replace(/\W/g, '').toLowerCase();
// make a link to the post
var link = document.createElement('li');
link.innerText = p.title;
link.setAttribute('id', p.slug);
link.onclick = function() {
var slug = this.getAttribute('id');
alert('slug:' + slug + ' id:' + getPostId(slug));
};
document.body.appendChild(link);
}
要与路由器一起使用,请执行以下操作:
var postId = getPostId($routeParams.slug);
$scope.post = $firebase(new Firebase.child('posts/').child(postID));