angular路由守卫

任何用户都能在任何时候导航到任何地方。 但有时候这样是不对的。

  • 该用户可能无权导航到目标组件。
  • 可能用户得先登录(认证)。
  • 在显示目标组件前,你可能得先获取某些数据。
  • 在离开组件前,你可能要先保存修改。
  • 你可能要询问用户:你是否要放弃本次更改,而不用保存它们?

你可以往路由配置中添加守卫,来处理这些场景。 守卫返回一个值,以控制路由器的行为:

  • 如果它返回 true,导航过程会继续
  • 如果它返回 false,导航过程就会终止,且用户留在原地。
  • 如果它返回 UrlTree,则取消当前的导航,并且开始导航到返回的这个 UrlTree.

注意:守卫还可以告诉路由器导航到别处,这样也会取消当前的导航。要想在守卫中这么做,就要返回 false

阅读更多

angular辅助路由

辅助路由是指在路由出口router-outlet中指定一个name标识符,从而将相应的组件映射道匹配的name的路由上,看路由配置

1
2
3
4
5
6
7
8
9
10
const routes: Routes = [
{path:'',redirectTo:'/home',pathMatch:'full'},
{path:'chat',component:ChatComponent,outlet:'aux'},
{path:'home',component:HomeComponent},
{path:'product/:id',component:ProductComponent,children:[
{path:'',component:ProductDescComponent},
{path:'seller/:id',component:SellerInfoComponent}
]},
{path:'**',component:Code404Component}
];

入口模版

1
2
3
4
5
6
7
<a [routerLink]="['/']">主页</a><br/>
<a [routerLink]="['/product',1]">商品详情</a>
<input type="button" value="商品详情" (click)="toProductDetails()">
<a [routerLink]="[{outlets:{aux:'chat'}}]">开始聊天</a>
<a [routerLink]="[{outlets:{aux:null}}]">结束聊天</a>
<router-outlet></router-outlet>
<router-outlet name="aux"></router-outlet>

当点击开始聊天时,chat组件就会映射到匹配name的相应路由出口上去,在配置辅助路由同时,也可以配置主路由

1
2
3
<a [routerLink]="[{outlets:{primary:'home',aux:'chat'}}]">开始聊天</a>   
<router-outlet></router-outlet>
<router-outlet name="aux"></router-outlet>

angular子路由配置

子路由是组件下新增一个子路由组件,可以通过指令完成初始化

1
ng generate component crisis-center/crisis-center

把组件模板修改成这样:

1
2
<h2>CRISIS CENTER</h2>
<router-outlet></router-outlet>

CrisisCenterComponent 和 AppComponent 有下列共同点:

  • 它是危机中心特性区的根,正如 AppComponent 是整个应用的根。
  • 它是危机管理特性区的壳,正如 AppComponent 是管理高层工作流的壳。

阅读更多

node缓冲区

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

在v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象

阅读更多

解决angluar在Node服务器上的路由问题

官方教程中没有涉及到node服务器对angluar的编译文件解决路由的问题,其实原理与apahce是一样的,当路由返回404的时候,应该让路由再直接找index.html这个源文件,具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var express = require("express");
var app = express();
var path = require("path");

/* 这里是设置中间件,让编译文件的静态文件可以被获取 */
app.use(express.static("dist/w-app"));

/* 这里是不管url地址是什么,路由都统一在index.html上进行查询,然后获取到真实的Angluar的路由 */
app.get('*', function (req, res, next) {
res.sendFile(path.join(__dirname,'dist/w-app/index.html'));
});

app.listen(3000,function (){
console.log("server is running");
});

如何利用git远程部署服务器的代码

使用场景

ftp部署代码很麻烦,因为需要隔离出已经修改与为修改的部分,并进行上传,但是git很方便,如果在远程服务器已经绑定了ssh免密码登陆就更加方便,只需要推送,就可以将代码部署到服务器,而且不用去区分哪一些是修改过的,哪一些是没有修改过的。

远程服务目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
├── html
└── myApp // 项目
   └── site // 这是工作区,手工创建空目录
   ├── index.php
   ├── test2.php
   ├── test3.php
   └── test.php
└── gitLab // 这是版本区
├── branches
├── config
├── description
├── HEAD
├── hooks // post-receive钩子代码写在这里面
├── index
├── info
├── objects
└── refs

阅读更多

TypeScript模式下为PIXI添加Matter物理引擎的尝试

TypeScript是非常适合写游戏的,原因在于游戏引擎对接口参数都有非常严格的类型要求,在原本JavaScript的模式下,对类型的“编程心理约束”实际上是非常弱的,在自己的项目经验中,记得一次写BitmapText的类型时,无意间使用了数字类型,而解释器根本不可能报错,又不可能没有编译器排错,所以导致自己花了半小时的时间找到这个错误,当然根本原因,在与,我对PIXI的BitmapText这个类本身了解程度不高,第一次使用,所以我认为如果在TypeScript模式下,在编译状态就会报错:”我传入的数据类型是Number,而类的接口是String”,废话少说,我们尝试一下在TypeScript的环境下,如何为PIXI添加物理引擎。

阅读更多