angular ng操控属性

又掉了一个坑
这里来说说ng-value=”xxx”与value=
闲话少说,看范例

1
2
3
4
5
<select id="choice_category" class="form-control" ng-model="current_category">
<option value="">---Please select---</option>
<!-- not selected / blank option -->
<option value="{{category._id}}" ng-repeat="category in categorys" >{{category.name}}</option>
</select>

理论上current_category会与categorys中的元素进行对比 然后select会选中对比成功的option
如果用ng-value=”category._id”那么神奇的事情发生了,option会平白无故的多出一条

1
<option value="? string:123?"></option>

然后select选择的是空也就是上面那个option,因为上面呢个option没有任何的元素
其中详细的情况我也没去了解.个人理解如下

理解

因为current_category与categorys都是用ajax获取的,所以我设置了一个延迟来模拟网络的加载.

1
2
3
4
5
6
7
8
9
10
11
setTimeout(function(){
$scope.categorys=[{
_id:"56896be6a43fa3e02695c01a",
name:"56896be6a43fa3e02695c01a"
},{
_id:"568a6237a807cee863a8eb52",
name:"568a6237a807cee863a8eb52"
}]
},1000)
$scope.current_category="56896be6a43fa3e02695c01a"

这里我没用$timeout而用setTimeout一模拟发现情况是一模一样,
但是把ng-value改为value=””则不会出现这种情况
在这之前我还排查了是不是categorys数量太多而导致的,看来不是.下面就开始分析一下了

分析

简单来说就是current_category先更新了,categorys后更新并且没有$apply或者$apply在current_category复制更新的时候就调用了,
或者就是current_category先更新了ng-repeat并没有循环完毕之类的情况,等等等等

我也说不清具体是啥情况 只能猜了

情况1

tcp是块传输的,那么是不是先到的块就先给赋值了,如果categorys数量太多那么这个块肯定就在后面
于是current_category块就先到了,于是angularJS就开始更新绑定的value然后ng-repeat循环并没有完成

情况2

ng-repeat已经开始循环了,但是current_category并没有得到值,或者说在ng-repeat循环完毕或者循环到一半的时候
current_category就已经开始赋值了,但是ng-repeat并没有得到这个值,所以就选择不到那个option

情况3

参照情况2,单纯的value=””是可以的,angularJS在编译模板的时候对于ng-value与value=””模板处理机制不同所导致的.

个人觉得情况3比较可能…不过我也没去看源码深究,大家就看看吧~以后遇到这种情况可以换value=””试试

angular解析属性中的特殊符号

又掉入一个坑了…例子如下

ngSrc

1
2
3
<audio ng-src="usr"></audio>
$scope.usr="http://m2.music.126.net/9y-3IeHL6x1OLY0bO4QGxg==/7948369558839613.mp3"

上例的代码运行会爆插值错误
也就是Error: $interpolate:interr
Interpolation Error
于是你得用到一个插件angular-sanitize.min.js

$sce

引用了angular-sanitize.min.js插件后再运行就会发现还是会报错
WHY?因为你还没声明或者说转换

1
$scope.usr=$sce.trustAsResourceUrl("http://m2.music.126.net/9y-3IeHL6x1OLY0bO4QGxg==/7948369558839613.mp3")

这样就可以运行了,并且$sce与angular-sanitize.min.js两者缺一不可

socket.io验证挂载session

socket.io 1.0验证挂载session

根据客户端的cookie中的connect.sid获取服务端中的session
服务端采用的是mongodb-session
获取失败返回callback(err,false);
获取成功返回callback(null,true);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//验证设置session
io.set("authorization", function (handshakeData, callback) {
//解析cookie
handshakeData.cookie = cookie.parse(handshakeData.headers.cookie)
console.log(handshakeData.cookie)
var sessionid = handshakeData.cookie['connect.sid']
if (sessionid) {
var sid = sessionid.split(':')[1].split('.')[0];
//用mongodb查询语法
mongoose.connection.db.collection("sessions", function (err, collection) {
collection.find({_id: sid}).toArray(function (err, results) {
if (err) {
callback(err, false)
} else {
handshakeData.session = JSON.parse(results[0].session)
console.log(23, handshakeData.session)
callback(null, true)
}
});
});
}
})

注意其中的handshakeData.session = JSON.parse(results[0].session)
这段就是给socket挂载上一个session属性 这样是行得通的 但是要在socket获取不能采用
socket.handshake.session而要采用socket.request.session

1
2
3
4
5
6
io.sockets.on("connection", function (socket) {
//获取用户session
var _name=socket.request.session.user.name;
})

socket.io 1.0中的to与in

socket 1.0中的to 与in

众所周知socket.io有全局广播事件和针对某个房间(room)来发送事件
比如

1
2
3
4
5
6
7
8
//新建个房间
io.of("/chat").on("connection",function(socket){
//针对chat发送hello事件
socket.broadcast.to('chat').emit('hello',data);
})
//连接到这个房间
socket.join("chat")

window10-0x8e5e03fe处理办法

0x8e5e03fe是什么

谷歌翻墙了一下得出的结论是软件冲突,导致服务不能正常安装

NET3.5 0x8e5e03fe

今天安装NET3.5的时候就报了这个错误,很纳闷,百度了一下得出的基本都是进行干净模式然后安装
但是这个办法对我无效,重启后安装还是报0x8e5e03fe

解决

这篇文章有个解决方案,
以管理员模式运行cmd 然后输入以下的指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
net stop wuauserv
net stop cryptSvc
net stop bits
net stop msiserver
ren C:\Windows\SoftwareDistribution SoftwareDistribution.old
ren C:\Windows\System32\catroot2 catroot2.old
net start wuauserv
net start cryptSvc
net start bits
net start msiserver

我输入net stop msiserver的时候就报错 没有启动 Windows Installer 服务。
这时候我大致清楚了无法安装NET3.5的原因应该是Windows Installer 服务没启动 于是我仅仅启动了Windows Installer 服务然后安装NET3.5就okay了

NET3.5的离线安装

百度经验
下载win10原版ISO然后提取出sxs文件就行了

angular学习笔记-MVC

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<title></title>
<script src="http://apps.bdimg.com/libs/angular.js/1.4.0-beta.4/angular.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div ng-controller="myCtrl">
<input type="text" ng-model="msg"/>
<div>{{msg}}</div>
</div>
<script>
var app=angular.module("app",[])
app.controller("myCtrl",function($scope){
$scope.msg="请输入"
})
</script>
</body>
</html>

M(modle)

M层即为数据层也就是modle
上例代码中$scope.msg=”请输入”这个就是一个modle层


这个msg也是modle层 因为angularJS为双向数据绑定
当输入框的文字变化,下面的div文字也会变化

V(view)

V层即为视图层.


这个msg即为视图层,目前还没有起到数据交换也就是M层渲染至V层
需要C层来进行控制

C(controller)

C层即为控制层
myCtrl就是一个控制器用来控制数据的交换

angular学习笔记-简介

简介

angularJS是一个MVVM框架,适合用来做单页应用,angularJS2比1变动比较大.这里的笔记针对angularJS1

ngApp

在HTML文件的开始处声明一个ng-app=”xxx”这样就声明了一个angularJS的app

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html ng-app="hello">
<head>
<title></title>
</head>
<body>
<div ng->
</div>
</body>
</html>

angular.module

声明了app后就可以开始建立module了
其中module(name,[])后面数组留空会自动注入依赖

1
var app=angular.module("hello",[])

声明了module后就可以建立控制器,服务,自定义指令等等..