将url id重命名为angularjs中的可读格式

时间:2014-01-06 05:46:15

标签: angularjs firebase angularjs-routing

我使用firebase自动生成id将每个帖子存储在firebase中。让我们说-JBuEJXgILubWjxECjwj

然后我像这样查询帖子

Post.getPost($routeParams.postID); //snippet code

因此,当用户访问example.com/userid/-JBuEJXgILubWjxECjwj时会显示内容。但我希望网址可读。

当用户访问example.com/userid/mystoryexample/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。 任何想法?

1 个答案:

答案 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));