2

我正在使用的angular-ui 路由器,它包含一个状态机(https://github.com/angular-ui/ui-router)。这个伟大的路由器允许用户指定参数作为 URL 的一部分。

例如:

$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 参数更改,则仍会调用 transitionTo 函数(例如,手动更改 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;
  }

equalForKeys 是比较参数,如果有差异则返回 false。

我的问题:你知道为什么作者会这样写吗?您认为更改是否安全,以便仅更改参数时没有过渡?

非常感谢您一直阅读到这里,以及任何想法

里奥

编辑:似乎这是设计使然。刚刚发现:https ://github.com/angular-ui/ui-router/issues/46

4

1 回答 1

2

我通常用抽象状态和嵌套来解决这种性质的问题。将不会根据 url 参数更改的部分放入抽象父状态,您将避免额外的服务器命中。我更喜欢将它们放入父状态的解析或自定义数据部分,但如有必要,您可以通过范围继承来检索它们。确保您阅读并理解范围继承的规则,因为有些事情(至少对我而言)是出乎意料的。

您可以在此处阅读更多详细信息:https ://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views 。此外,angular-ui 附带的示例应用程序是开始理解状态嵌套的好地方。

于 2013-10-16T22:22:40.620 回答