Angularjs 当只有参数改变时,为什么要转换新状态路由器?
我正在使用新的angular ui路由器,它包含一个状态机()。这个伟大的路由器允许用户指定参数作为URL的一部分 例如:Angularjs 当只有参数改变时,为什么要转换新状态路由器?,angularjs,angular-ui,Angularjs,Angular Ui,我正在使用新的angular ui路由器,它包含一个状态机()。这个伟大的路由器允许用户指定参数作为URL的一部分 例如: $stateProvider .state('contacts.detail', { url: "/contacts/:contactId", templateUrl: 'contacts.detail.html', controller: function ($stateParams) { // If
$stateProvider
.state('contacts.detail', {
url: "/contacts/:contactId",
templateUrl: 'contacts.detail.html',
controller: function ($stateParams) {
// If we got here from a url of /contacts/42
expect($stateParams).toBe({contactId: 42});
}]
})
(见附件)
这意味着,当用户导航到/contacts/42时,状态更改为“contacts.details”,42参数被注入控制器
但是有一个问题。如果只有url参数更改,则仍将调用Transitiono函数(例如,如果手动更改url或将url绑定到输入框,则可能会发生这种情况)。这反过来会导致该状态的视图指令被重新创建,这既浪费时间,又是一个问题,如果我们只想更新该状态中的某些内容
这似乎是故意的。从代码中:
// Starting from the root of the path, keep all levels that haven't changed
var keep, state, locals = root.locals, toLocals = [];
for (keep = 0, state = toPath[keep];
state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams);
keep++, state = toPath[keep]) {
locals = toLocals[keep] = state.locals;
}
EqualWorkeys用于比较参数,如果存在差异,则返回false
我的问题:你知道作者为什么会这样写吗?您认为更改安全吗?这样,当只有参数会更改时,就不会发生转换
非常感谢你一直读到这里,还有任何想法
狮子座
编辑:看来这是故意的。刚刚发现:我通常用抽象状态和嵌套来解决这种性质的问题。将不根据url参数更改的片段放入抽象父状态,这样可以避免额外的服务器命中。我更喜欢将它们放在父状态的“解析”或“自定义数据”部分中,但如果需要,可以通过作用域继承来检索它们。一定要阅读并理解范围继承的规则,因为有些事情(至少对我来说)是出乎意料的
您可以在此处阅读更多详细信息:。此外,AngularUI附带的示例应用程序是开始理解状态嵌套的好地方 这是一种更好的违约行为;路由器应该足够好,你不必在你这边维护路由状态(默认的角度路由器在这方面很糟糕)