view.exist问题
Closed this issue · 1 comments
xinglie commented
考虑如下代码:
KISSY.add('app.views/home',function(S,MxView){
return MxView.extend({
render:function(){
var self=this;
S.use('med-calendar',function(S,Cal){
if(!self.exist)return;
}):
}
});
},{
requires:['magix/view']
});
注意render方法中 **if(!self.exist)return;**代码,由于S.use是异步载入的,那么很可能在载入后,该view已经被卸载掉,导致接下来在访问或使用DOM节点时,出现异常
类似的还有model异步获取数据、直接使用XHR与后台交互等,如果未加eixst判断,很可能在用户已经点击到别的地方,当前view已经卸掉后这些异步请求才返回,而此时访问界面通常都会由于节点已经不存在而导致异常,影响OPOA的后续运行,所以需要添加exist判断当前view确实存在才进行操作界面
通常我们在开发中很难记得去添加exist判断,导致后期排队错误非常困难,因为缺少判断并不会立即导致程序出错,这种出错往往在网络不太好,而用户切换view出现的
我们对于konckout来看这个问题
对于konckout伪代码如下:
Model={
name:ko.observe('a');
}
<span data-bind="text:name"></span>
我们在更新界面时如下操作:
Model.name('b');
注意:
- 更新界面时我们操作的是Modle
- 更新Model时我们使用Model.name('b')而非Model.name='b'
konckout把更新界面的动作在内部处理了,它内部有判断当前节点是否存在才进行更新,而magix是采用大面积更新的方式,很难做到对所有的节点操作进行代理,因此这块是一个比较大的隐患,后续需要解决这个隐患才能使magix更安全健壮
xinglie commented
使用资源托管及view签名的文案解决异步问题