JSPatch 동적 업데이트, 사례 분석

3818 단어
본고는 프로젝트에서 핫 픽스된 코드 세션을 붙입니다.
require('UIView, JPObject, HtmlAllViewController,DataManager,EMClient,EaseMessageViewController')
defineClass("GHAcceptOrderViewController", {
    tableView_willSelectRowAtIndexPath: function(tableView, indexPath) {
        var row = indexPath.row();
        var dataArr = self.sourceArr().toJS();
        var vo = dataArr[row];
        if (vo.type() == 1 && vo.status() == 1) {
            return null;
        }
        return indexPath;
    },
})
defineClass("HomePageViewController", {
    clickIndex: function(index) {
        var data = self.valueForKey("homeVO");
        var dataArr = data.banners().toJS();

        if (dataArr&&dataArr.length>index) {
            var vo = dataArr[index];
            if (vo.type()) {
                if (vo.type() == 2) {
                    
                    self.recharge();
                }
            }
            if(vo.linkUrl()&&vo.linkUrl().length()>6){

                var ctrl = HtmlAllViewController.alloc().init();
                var token = DataManager.getInstance().user().token();
                var header = vo.linkUrl().toJS() + "?token=" + token.toJS();

                ctrl.setValue_forKey(header,"mUrl");
                ctrl.setValue_forKey(vo.name(),"mTitle");
                  self.navigationController().pushViewController_animated(ctrl,true);
            }
        }
    },
    onFloatImage: function(tap) {
        var vo = DataManager.getInstance().user();
        self.view().setUserInteractionEnabled(false);

        var weakSelf = __weak(self);
        var success = block(function(){

            weakSelf.view().setUserInteractionEnabled(true);

              var ctrl = EaseMessageViewController.alloc().initWithConversationChatter_conversationType("pinjian001",0);
              var dict = require("NSMutableDictionary").alloc().init();
            dict.setObject_forKey(" ", "senderName");
            if(vo.avatar()){
                dict.setObject_forKey(vo.avatar(), "senderAvatar");
            }else{
                dict.setObject_forKey("order_expert_desc_icon_bgImage.png", "senderAvatar");
            }
            dict.setObject_forKey(" ", "receiverName");
            dict.setObject_forKey("doctor_defalt_icon.png", "receiverAvatar");

            ctrl.setValue_forKey(" ","title");
            ctrl.setValue_forKey(dict,"pinjian");

            weakSelf.navigationController().pushViewController_animated(ctrl,true);
        });

        var failure = block("EMError *", function(aError){
          weakSelf.view().setUserInteractionEnabled(true);
        });
        
        EMClient.sharedClient().asyncLoginWithUsername_password_success_failure(vo.hxUsername(),vo.hxPassword(),success,failure);

    },
    readMessage:function(notification){
        self.tabBarItem().setBadgeValue(null);
        self.showMessage(false);
    },
})

특별히 설명해야 할 것은:
1.oc의 속성 접근은 js에서 반드시 통과해야 합니다.() 액세스,
2.oc의 데이터는 js단에서 호출됩니다. 반드시 통과해야 합니다.toJS()를 js 데이터 형식으로 변환하기;
3.oc의 block은 js 이쪽에 있습니다. 위 코드와 같이 참고 형식에 특히 주의하십시오.
4.oc의 block은 js단에서 호출됩니다. 약한 인용을 통해 수식해야 합니다. 그리고 block에서weakSelf를 사용해야 합니다. 위의 코드는 다음과 같습니다.
var weakSelf = __weak(self);
5. 사용된 헤더 파일은 반드시 require();
건의: 로컬 setup Development 디버깅을 먼저 하고, 디버깅이 성공한 후, 여러 번 오류가 없는지 검사한 후에 전역을 발표합니다.
또한 jspatch 단점 디버깅에 대해:https://github.com/bang590/JSPatch/wiki/JS-%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95
자세한 내용:
http://www.jianshu.com/p/0cb81bf23d7a
http://blog.cnbang.net/works/2767/
http://www.cnblogs.com/dsxniubility/p/5080875.html
http://jspatch.com/

좋은 웹페이지 즐겨찾기