【问题标题】:Meteor, Iron:Router Passing Multiple Properties on Router.goMeteor,Iron:Router 在 Router.go 上传递多个属性
【发布时间】:2015-01-07 05:36:26
【问题描述】:

我的困境是我想将多个对象属性传递给 Meteor 中的 Iron:router 路由。原因是我想传递一个属性来命名我的 url 和一个属性来查找集合项。它们完全相互独立,我不能使用 url 属性,因为它不是集合项中的值。这就是我所拥有的:

Template.items.events({
'click': function () {
    itemName = this.name.replace(/ /g,'')
    Router.go('itemDetails', {itemName: itemName})
    }
});

问题是,尽管路由器处理得很好并将我发送到正确的 url,但我无法使用 itemName 找到我正在寻找的集合项目对象(假设这是不可能的)。

Router.route('/items/:itemName', {
    name: 'itemDetails', 
    data: function() {return Items.findOne({name: this.params.itemName})}
});

上述路由器配置不会返回任何内容,因为name != this.params.itemName 用于任何对象。

我尝试过传递this 对象,或者创建具有多个属性的对象,但 Iron:router 没有它。

感谢任何帮助,谢谢。

编辑#1:为了帮助进一步解释这个问题,我的问题与路由到在 URL 中使用多个 id 的页面相同。例如,我将如何将属性传递给 Iron:router 以填充 :_id:itemId 属性?

Router.route('items/:_id/:_itemId', {
    name: 'detailDetails',
    data: function() {...}
});

编辑#2:我想做的具体是将两个属性传递给 Iron:router 并将其中一个附加到 URL,另一个用于路由的 data 属性以返回集合项.示例:

....
    Router.go('itemDetails', {_id: itemBeingPassedId, itemName: nameToBeAppendedToURL})
....

Router.route('/items/:itemName', {
    name: 'itemDetails',
    data: function(){return Items.findOne(_id)
});

每当我尝试这样做时,它都会说_id 未定义。所以基本上,我怎样才能将属性传递给data,而不让它成为URL的一部分并使用this.params

【问题讨论】:

  • 嗯,你正在删除空格,所以它当然找不到它。考虑将slug 属性添加到您的集合对象(在创建时或当itemName 更改时),您只需使用Router.go('itemDetails', {slug: this.slug})Items.findOne({slug: this.params.slug})
  • 是的,我知道为什么找不到它的原因——我想我解释得不好。我试图避免使用蛞蝓,但似乎这可能是解决它的唯一方法。感谢您的帮助。

标签: javascript meteor routes iron-router


【解决方案1】:

问题是如何将多个参数传递给Router.go?只需将它们全部放在第二个参数的对象中即可:

Router.go('itemDetails', {_id: 'foo', '_itemId': bar});

编辑:

好的,如果你想向url传递任意值,你可以使用查询参数:

Router.go('itemDetails', {itemName: 'foo'}, {query: 'id=bar'});

id 仍然在 url 中,它看起来像这样:

http://example.com/items/foo?id=bar

你可以像这样检索它:

Router.route('/items/:itemName', {
    name: 'itemDetails',
    data: function(){
        return {
            item: Items.findOne(this.params.query.id),
            itemName: this.params.itemName
        };
    }
);

【讨论】:

  • 不,不完全是。我想知道为什么我不能将多个属性传递给 Iron:router,并且只在数据属性中调用这些属性之一。我即将更新我的问题以使其更具体。
  • 在渲染新页面后如何将其传递到我的角度控制器?
  • @Nachbar90,我没有使用过 angular,但如果它类似于 blaze,那么您在数据中返回的任何内容都将可用于您的模板。
  • 一般有什么方法可以传递参数或数据,而不显示在 url 中?我希望用户看到“example.com/overview/UPS”而不是“example.com/overview/UPS?id=NkYfJsJyATcHDM2om”
  • @Savvas,您可以根据 url 中的任何内容从数据库中提取内容,只需在数据库中查询 _id 以外的内容:return {item: Items.findOne({"itemName":this.params.itemName})};
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
相关资源
最近更新 更多