Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 当只有参数改变时,为什么要转换新状态路由器?_Angularjs_Angular Ui - Fatal编程技术网

Angularjs 当只有参数改变时,为什么要转换新状态路由器?

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

我正在使用新的angular ui路由器,它包含一个状态机()。这个伟大的路由器允许用户指定参数作为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参数更改,则仍将调用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附带的示例应用程序是开始理解状态嵌套的好地方

这是一种更好的违约行为;路由器应该足够好,你不必在你这边维护路由状态(默认的角度路由器在这方面很糟糕)