Skip to content

Commit b48930e

Browse files
committed
20160419-搭建一个PC版本的 ng-redux 项目 1 (引入开源库)
1 parent 9568779 commit b48930e

2 files changed

+49
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# 搭建一个PC版本的 ng-redux 项目 1 (引入开源库)
2+
3+
## 背景
4+
redux在建立的时候,就把项目定位于不仅仅服务于react。最近因为项目实际的需要,搭建了angular与redux结合的项目。类似于react全家桶,要想把ng与redux结合起来,也需要好几个库或者框架。基本联系如下图。也用了webpack打包与babel转码器。
5+
6+
![](image)
7+
8+
9+
## angular
10+
由于浏览器版本问题(产品定位是IE7及IE8),暂时不考虑react及高版本的ng,定位了1.0.8版本的ng。以此为基准考虑其他框架。为了方便切换版本,npm安装的是1.4.x,而另外手工准备一份旧的,需要的时候直接打包进vendor.js中。
11+
12+
## ui-router
13+
在引入这个库时,并没有多大问题,因为这是一个典型的ng生态ui解决方案,**看源码**可以知道是里面的angular是全局变量,要与webpack结合,推荐用webpack官方的`imports-loader`载入。
14+
15+
## redux-ui-router
16+
利用官网的利用和ng 1.4.x 的时候都好好的,但是一切换到1.0.8,就会提示
17+
`WARNING: Tried to load angular more than once.` 和报错 `Uncaught TypeError: window.angular.$$csp is not a function` 一开始的时候,并我没有理会waring,而直接去找错误,一般会认为`$$csp`是一个新版本才有的功能。但是实际上并不是,1.0.8也有。于是我把目光转向warning,但是那句warning即使google找到的答案也是千奇百怪的。
18+
经过自己冷静思考和逐步排查分析之后,终于发现是这样的。由于`redux-ui-router`要求ng版本为1.4.x (peerDependencies) ,但是我并不是那个版本,所以我的ng并不是直接在npm上拿下来的包,而是手工放进去了。但是npm还是会把1.4.x版本的ng拿到node_modules里面去,这样,当 redux-ui-router 中运行 `require('angular')`的时候,拿的是1.4.x版本的ng,同时我全局引入1.0.8的ng,两个就冲突了。
19+
20+
于是我新建了一个入口文件,直接引用redux-ui-router下面的一些功能,把`require('angular')`避开了。成功解决了这个问题。
21+
22+
## ng-redux
23+
除了上面重复引入ng的问题,使用ng-redux的时候,还有另外一个问题。
24+
25+
官方的例子是利用`controllerAs`语法的,在高版本的ng下跑是没有问题的,但一切换到目标版本就会有问题。大招**看源码**有点费时间,在此之前我们可以先尝试**看测试用例**
26+
27+
https://github.com/wbuchwalter/ng-redux/blob/master/test/components/connector.spec.js#L38
28+
29+
```javascript
30+
it('Should extend target (Object) with selected state once directly after creation', () => {
31+
connect(
32+
() => ({
33+
vm: { test: 1 }
34+
}))(targetObj);
35+
36+
expect(targetObj.vm).toEqual({ test: 1 });
37+
});
38+
```
39+
40+
由于之前一直在用过`react-redux`,connect是redux数据中心发生变化之后调用的函数,通知视图要改变,我们看到ng-redux在此要做的事情是在targetObj中修改一些属性。再结合以前用ng时候的情况,
41+
修改 `$scope`的属性就可以引起视图的改变。于是我把官网绑定在controller的例子改成绑定在`$scope`上。于是在controller中就这样写
42+
```
43+
const unsubscribe = $ngRedux.connect(state=> {
44+
//some code
45+
})($scope);
46+
```
47+
48+
##
49+
于是,我就把这三个库引入到项目中,从1.4.x版本的ng迁移到了1.0.8版本的ng。

asset/ng-redux-flow.png

40.4 KB
Loading

0 commit comments

Comments
 (0)