所以我希望在我超酷的 can.js 应用程序中创建一些路由。目标是这样的……</p>
#!claims ClaimsController - lists claims
#!claims/:id ClaimController - views a single claim
#!claims/new ClaimController - creates a new claim
#!claims/:id/pdf - do nothing, the ClaimController will handle it
#!admin AdminController - loads my Administrative panel with menu
#!admin/users - do nothing, the AdminController will handle it
#!admin/settings - do nothing, the AdminController will handle it
那么我们该怎么做呢?
“claims route”: function() { load('ClaimsController'); },
“claims/:id route”: function() { load('ClaimController'); },
“admin”: function() { load(‘AdminController’); },
酷豆,我们走了。那么,如果有人将链接发送给类似...
http://myapp#!claims/1/pdf
什么都没发生!好的,让我们添加路线。
“claims/:id/pdf route”: function() { load('ClaimController'); },
伟大的。现在该链接有效。在这里,路由器的工作只是加载控制器。控制器将识别出需要 pdf 操作,并显示正确的视图。
所以假装我已经加载了一个声明claims/:id
,我编辑了一两件事。然后我单击打印预览按钮查看 PDF 并将我的路线更改为claims/:id/pdf
.
应该发生什么……索赔控制器正在观察路线并显示 pdf 视图。
实际发生了什么……路由器看到更改,匹配claims/:id/pdf
我们添加的路由,并重新加载声明控制器,显示从服务器/缓存中提取的声明的新版本,丢失我的更改。
为了尝试定义问题,我需要路由器识别路由何时更改,路由属于哪个控制器,如果控制器已经加载,请忽略它。但这很难!
claims //
claims/:id // different controllers!
claims/:id //
claims/:id/pdf // same controller!
我们可以绑定“控制器”更改。所以定义路由can.route(':controller')
和绑定在:controller
.
{can.route} controller
// or
can.route.bind('controller', function() {...})
但是点击一个声明(从 ClaimsController 更改为 ClaimController)不会触发,因为claim
在这两种情况下第一个标记是相同的。
有没有我可以依赖的约定?我是否应该指定应用程序中的每条路由并检查控制器是否已加载?我的首选路线网址不起作用吗?