1

我正在开发一个SPA webapplicationwith DurandalJS,但我不明白一些事情。

假设我有page 12。上面page 1有一个模式,它在databasewith中创建一个实体BreezeJS并返回一个键(在数据库中生成)。

我想传递这个获取的密钥,然后转到我的第二页,第 2 页。我知道当我把它放在 url 中时我该怎么做

http://localhost:60312/#/page2?orderid=2&repairorder=2

但这不是 的方式Durandal,或者是吗?用户可以输入他自己的数字,但后果自负!

我该如何解决这个问题?

4

2 回答 2

8

我想为非常好的@Joseph Gabriel 答案添加一些内容。在 durandal 中,您可以这样做:

router.map( url: 'page2/:orderid/:repairorder',
            name: 'Page2',
            moduleId: 'viewModels/page2');

http://localhost:60312/#/page/2/2

而且,你可以这样做:

router.map( url: 'page2',
            name: 'Page2',
            moduleId: 'viewModels/page2');

http://localhost:60312/#/page2?orderid=2&repairorder=2

您不必指定要传递的所有参数。哟可以从活动方法的输入中获取此参数。

var activate = function(context) {
  console.log(context.orderid);
  console.log(context.repairorder);
}

有时,如果您希望用户可以存储 url 以重复仅在浏览器中复制该查询,则第二种解决方案可能更合适。

于 2013-05-03T14:48:05.190 回答
5

据我所知,在 Durandal 应用程序中的视图模型之间传递参数的唯一无缝方式是使用普通的基于哈希的 url 参数。
在您的示例中,您可以定义一个带有 orderId 和 repairOrder 参数的路由器,然后您的网址将如下所示: http://localhost:60312/#/page/2/2

如果您的数据不太敏感,这是最佳选择。将导航参数保持打开状态,并在第二个视图模型中小心处理这些值。换句话说,设计您的视图模型,使其能够正确处理任何值——即使用户直接修改参数值,您的视图模型也应该能够正确处理它。

能够直接设置 url 参数可能是有利的,但在使用它们之前必须小心确保值的完整性。

但是,如果您需要隐藏参数,您确实有一些不同的选择:

加密:使用tea.js之类的加密库,对值进行加密,然后将其添加为导航的参数值。然后,当然,在使用它之前在第二页上对其进行解密。这允许 Durandal 的router导航正常工作,同时阻止用户提供自己的值。

如果您确实需要阻止用户输入自己的值,并且您可以承担一些额外 KB 的开销,那么只要您只需要传递几个参数,这是一个很好的方法。

共享数据模型:使用在两个视图模型之间共享的单例模型。此模型可以根据required()需要手动进行,并且本质上用作在一个或多个视图模型之间共享的应用程序状态的存储库。这很好用,但有点像拥有一个大的全局变量——如果过度使用它会变得混乱。

直接修改 VM:( 仅适用于单例视图模型)在导航到第二个视图模型之前 手动require()设置其属性。

于 2013-05-03T11:51:42.490 回答