单个视图页永久链接空铁路由器

时间:2015-01-27 10:39:59

标签: javascript meteor iron-router

我在Iron-Router中设置了两条路线:' home' (所有帖子的分页列表)和' doc' (详细视图)。主页加载得很好,但只有先前查看过主页才能加载详细视图。否则它将呈现为空 - 并且它不能用作永久链接。

这将始终加载: http://localhost:3000/

这只会在家庭使用时加载。之前已被查看过: http://localhost:3000/doc/tZFawq8cgf43hZBaJ

路线:

Router.map(function() {
    this.route('home', {
        path: '/'
    });
    this.route('doc', {
        path: '/doc/:_id',
        data: function() {
            return MyPix.findOne({_id: this.params._id});
        }
    });
});

文档模板:

<template name="doc">
    <h1>{{this.name}}</h1>
    <img src="{{ this.url store='OriginalRetinaPix' }}" width="{{ this.metadata.width }}" height="{{ this.metadata.height }}" />
</template>

发布/订阅:

Meteor.publish('MyPix', function(cursor) {
    Counts.publish(this, 'numberOfPosts', MyPix.find(), { noReady: true });
    return MyPix.find({}, {sort: {uploadedAt: -1}, limit: 4, skip: cursor});
});

if(Meteor.isClient) {
    Session.setDefault('docCursor', 0);
    console.log('docCursor: ' + Session.get('docCursor'));
    Meteor.autorun(function(){
        Meteor.subscribe('MyPix', Session.get('docCursor'));
    })
}

btw:GitHub

上的项目

3 个答案:

答案 0 :(得分:1)

在“doc”路线上,您应该使用waitOn以便在页面加载时准备好数据。在Router.configure中添加加载模板

我建议您升级到新的iron:router路由声明,并添加meteorhacks:subs-manager以便在订阅上获得更好的缓存。

这是一个适用于你的案例的例子

var subs = new SubsManager();
Router.route('/doc/:_id', {
  name: 'doc',
  template: 'doc',
  waitOn: function() {
    return subs.subscribe('aPix', this.params._id);
  },
  data: function() {
    return {
      apix: MyPix.findOne({
        _id: this.params._id
      })
    };
  }
});

并在服务器端创建publications.js

Meteor.publish('aPix', function(id) {
  check(id, String);
  return MyPix.find(id);
});

答案 1 :(得分:1)

使用此功能。

Router.map(function() {
    this.route('home', {
        path: '/'
    });
    this.route('doc', {
        path: '/doc/:_id',
        waitOn: function(){ 
             return Meteor.subscribe('MyPix');
        },
        data: function() {
            return MyPix.findOne({_id: this.params._id});
        }
    });
});

此外,您的订阅应该如下所示。

Meteor.publish('MyPix', function(cursor) {
    //Counts.publish(this, 'numberOfPosts', MyPix.find(), { noReady: true });
    return MyPix.find({});
});

另外,添加meteor add sacha:spin,因为当你有很多人时,订阅会有一点延迟。

将此添加到每条路线。

loadingTemplate: "loading"

<template name="loading">
    {{> spinner}}
</template>

Router.onBeforeAction("loading");

如果你在'home'上显示100多张图片并且有人进入并且连接速度很慢,他会认为页面加载为空,或者其他内容。

答案 2 :(得分:0)

您只订阅了所有文档的子集。如果您直接转到/doc/tZFawq8cgf43hZBaJ,则标识为tZFawq8cgf43hZBaJ的文档可能不属于您在客户端上收到的文档子集。

注意:如果这个答案是正确的,您应该可以直接转到/doc/<id>以获取首页显示在主页上的文档(在第一页上,当会话变量docCursor0)。