Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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
Javascript 如何使用角度布线?_Javascript_Angular_Angular2 Routing - Fatal编程技术网

Javascript 如何使用角度布线?

Javascript 如何使用角度布线?,javascript,angular,angular2-routing,Javascript,Angular,Angular2 Routing,我有一个页面(比如第3页),可以从另外两个页面访问,比如第1页(父URL将是parent1-parent1/page1)和第2页(父URL将是parent2-parent2/page2) 由于angular在默认情况下会更改URL,因此只有在从第2页导航时,我才希望阻止URL更改,并且在从第1页导航时,我希望URL正常更改(对于父URL为parent1的所有页面) 我们可以这样做 router.navigate('page2',{skipLocationChange: true}); 但是,既

我有一个页面(比如第3页),可以从另外两个页面访问,比如第1页(父URL将是parent1-parent1/page1)和第2页(父URL将是parent2-parent2/page2)

由于angular在默认情况下会更改URL,因此只有在从第2页导航时,我才希望阻止URL更改,并且在从第1页导航时,我希望URL正常更改(对于父URL为parent1的所有页面)

我们可以这样做

router.navigate('page2',{skipLocationChange: true});

但是,既然我有更多的页面,如page4、page5、page6等,并且我想防止仅针对特定页面更改位置,那么我该如何在一个普通的地方做到这一点呢。

我认为一种非干扰性且干净的方法是将路由器导航封装在一个帮助器类(或函数)中,以实现您的应用程序特定需求

@Injectable
class LocationAwareRouter {
    constructor(private router: Router) {
    }

    public navigate(url: string) {
        this.router.navigate(url, { skipLocationChange: this.isLocationChange(url) };
    }

    private isLocationChange(url: string): boolean {
        return /* your fancy URL evaluation here */ ;
    }
}

您可以订阅特定组件中的路由器事件:

在事件处理程序中(导航启动后),您可以检查父URL是什么,并使用
history.replaceState()

您可以将所有规则都定义好的全局配置注入(即,哪些URL要覆盖,哪些不覆盖)。这样,您就不需要重构所有
路由器。导航
,只需在组件类中为每个组件指定一次规则:

constructor(router: Router, overrideUrlService: overrideUrlService) {
  router.events.subscribe(event => {
    if(event instanceof NavigationStart) {
        //have the override logic in some injectable service
        overrideUrlService.checkUrl(event.url);
    }
  }
});