limu/magix

view.exist问题

Closed this issue · 1 comments

考虑如下代码:

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');

注意:

  1. 更新界面时我们操作的是Modle
  2. 更新Model时我们使用Model.name('b')而非Model.name='b'

konckout把更新界面的动作在内部处理了,它内部有判断当前节点是否存在才进行更新,而magix是采用大面积更新的方式,很难做到对所有的节点操作进行代理,因此这块是一个比较大的隐患,后续需要解决这个隐患才能使magix更安全健壮

使用资源托管及view签名的文案解决异步问题