1 /** 2 * 更换邮箱 3 */ 4 define(["core", "component/process_components","component/verify_code"], function() { 5 6 var _html_new_email_input = [ 7 '<div class="we_change_email_box">', 8 '<p class="we_txt">您的账号当前绑定邮箱是:<a href="javascript:void(0);">$email$</a>,您可以:</p>', 9 '<ul class="we_list" attr="auth_type_form">', 10 '<li><input type="radio" name="auth_type" id="auth_by_phone" value="phone"><label for="auth_by_phone">通过已绑定手机更换</label></li>', 11 '<li><input type="radio" name="auth_type" id="auth_by_email" value="email"><label for="auth_by_email">通过已绑定邮箱更换</label></li>', 12 '</ul>', 13 '</div>', 14 '<p class="we_line"></p>', 15 '<div class="we_cell_form_box" attr="new_email_form"></div>', 16 ].join(''); 17 18 /** 19 * API 20 * @type {Object} 21 */ 22 var api = { 23 24 /** 25 * 验证邮箱 26 * @param {[type]} email [description] 27 * @return {[type]} 28 */ 29 validEmail:function(email,success,error){ 30 var url = $we.conf.ENV.__API + "/ajaxSafe/validateNewEmail"; 31 $we.utils.request(url, {email:email}, function(data) { 32 success(data.data); 33 }, function(data) { 34 error(data); 35 }, "POST", true); 36 } 37 }; 38 39 40 /** 41 * 输入新邮箱 42 */ 43 $we.widget.reg("new_email_input", { 44 interfaces:{ 45 /** 46 * render函数,AAA的接口函数,对于业务流组件来说,它完全可以转变为一个内置函数, 47 * 业务流组件在大多数情况下,不会调用interfaces 48 */ 49 render:function () 50 { 51 var t=this; 52 this.append(this.el, _html_new_email_input, { 53 email:$we.process.getData('email') 54 }); 55 var authPhone = $we.process.getData('phone'), 56 isPhonePassed = $we.process.getData('phone_passed'); 57 if(!(authPhone && authPhone.length>0 && isPhonePassed)){ 58 $(this.node['auth_type_form']).find('li:first').hide(); 59 $('#auth_by_email').attr('checked',true); 60 } 61 this.form = $we.widget.add("Form", $(this.node['new_email_form']), { 62 form_elements:[ 63 { 64 label:'新邮箱地址', 65 name:'new_email', 66 id:'new_email', 67 require:true, 68 expression:'email', 69 type:'autocomplete', 70 acConfig:{ 71 title:'请选择邮箱类型', 72 ds:['@sina.com', '@163.com', '@qq.com', '@126.com', '@hotmail.com', '@gmail.com', 73 '@sohu.com', '@yahoo.cn', '@yahoo.com'], 74 search_parse:function (data) 75 { 76 var v = this.val(); 77 var i = v.indexOf('@'); 78 if (i >= 0) { 79 var tail = v.substr(i); 80 if (data.indexOf(tail) >= 0) { 81 return v.substr(0, i) + data; 82 } 83 else { 84 return null; 85 } 86 } 87 else { 88 return v + data; 89 } 90 } 91 }, 92 success:"填写正确", 93 placeholder: "在这里输入邮箱" 94 } 95 ], 96 commit:function(){ 97 t.notify('next'); 98 } 99 }); 100 }, 101 102 /** 103 * 错误显示 104 * @param content 105 */ 106 showError:function (content) 107 { 108 var errorTip = $(this.node['error_tip']); 109 errorTip.html('<i class="we_icon_error"></i>' + content); 110 errorTip.show(); 111 }, 112 113 /** 114 * 清楚错误 115 */ 116 cleanError:function () 117 { 118 var errorTip = $(this.node['error_tip']); 119 errorTip.html(''); 120 errorTip.hide(); 121 } 122 }, 123 /** 124 * 初始化函数 125 * @param {element} el 通过业务流组件传递过来的参数,该业务流组件的business节点 126 * @param {object} params 初始化业务流组件时,每个组件传递的参数 127 */ 128 init:function (el, params) 129 { 130 this.el = el; 131 this.params = params; 132 }, 133 /** 134 * 每个组件,如果需要使用业务流的话,需要声明这个 135 */ 136 process:{ 137 /** 138 * 组件开始调用,业务流组件会调用这个接口来启用组件 139 */ 140 start:function () 141 { 142 this.render(); 143 }, 144 /** 145 * 组件结束调用,当这个业务结束的时候,业务流组件会调用它 146 */ 147 end:function () 148 { 149 $(this.el).empty(); 150 }, 151 /** 152 * 组件检测是否可以进行下一步 153 * 当组件需要进入下一步时,业务流组件将会调用这个接口, 154 * 这个接口需要通过 this.notify("goNext") 来通知业务流组件它检测通过, 155 * 否则业务流组件在这个地方会停滞下来 通过 this.notify("pause")来通知 156 */ 157 checkSucc:function () 158 { 159 var t = this; 160 if (this.form.valid()) { 161 var authType = $("input[name='auth_type']:checked"); 162 if (authType.length == 1) { 163 //$.cookie('we_chg_email',authType.val()); 164 var newEmail= this.form.getElement('new_email').val(); 165 api.validEmail(newEmail,function(){ 166 $we.process.setData('auth_type', authType.val()); 167 $we.process.setData('new_email',newEmail); 168 t.notify("goNext",{auth_type:authType.val()}); 169 },function(data){ 170 $we.comp.alert(data.msg); 171 }); 172 } 173 else { 174 $we.comp.alert('请选择认证方式'); 175 } 176 } 177 } 178 }, 179 events:{ 180 } 181 }); 182 183 var _html_new_email_auth = '<div class="we_cell_form_box" attr="root"></div>'; 184 185 /** 186 * 验证新邮箱 187 */ 188 $we.widget.reg("new_email_auth", { 189 interfaces:{ 190 /** 191 * render函数,AAA的接口函数,对于业务流组件来说,它完全可以转变为一个内置函数, 192 * 业务流组件在大多数情况下,不会调用interfaces 193 */ 194 render:function () 195 { 196 this.append(this.el, _html_new_email_auth); 197 this.extend("comp.verify_code", [this.node.root, this.params]); 198 this._super.render(); 199 }, 200 201 /** 202 * 错误显示 203 * @param content 204 */ 205 showError:function (content) 206 { 207 var errorTip = $(this.node['error_tip']); 208 errorTip.html('<i class="we_icon_error"></i>' + content); 209 errorTip.show(); 210 }, 211 212 /** 213 * 清楚错误 214 */ 215 cleanError:function () 216 { 217 var errorTip = $(this.node['error_tip']); 218 errorTip.html(''); 219 errorTip.hide(); 220 } 221 }, 222 /** 223 * 初始化函数 224 * @param {element} el 通过业务流组件传递过来的参数,该业务流组件的business节点 225 * @param {object} params 初始化业务流组件时,每个组件传递的参数 226 */ 227 init:function (el, params) 228 { 229 params = params || {}; 230 this.el = el; 231 this.params = params; 232 233 this.params.label1 = '新邮箱'; 234 this.params.label1_empty = '新邮箱'; 235 this.params.label2 = '邮箱验证码'; 236 this.params.label3 = '新邮箱验证码'; 237 238 //TODO 239 this.params.getCodeUrl = 'http://dev.we.sdoprofile.com/common/js/test/business/api.php'; 240 // 需要验证的验证对象的名称(从process.data中可能设置该值) 241 this.params.verifyName = 'new_email'; 242 // 验证成功后,将该名称储存到process.data中,默认该值与verifyName相同 243 this.params.saveVerifyName = 'email'; 244 // 冷却时间 245 this.params.cooldown = 120; 246 // 冷却时间设置的cookie名称 247 this.params.cookieName = '_we_comp_vme'; 248 // 验证对象的正则, function或者直接注明正则名称 249 this.params.verifyReg = 'email'; 250 // 传递给后端接口时,验证对象的名称 251 this.params.transName = 'email'; 252 253 this.params.formBefore = [ 254 { 255 label:'目前绑定邮箱', 256 value:'<span class="we_yellow">' + $we.process.getData('email') + '</span>', 257 name:'email', 258 type:'content' 259 } 260 ]; 261 this.params.formAfter = [ 262 { 263 label:'绑定箱验证码', 264 name:'email_code', 265 id:'email_code', 266 require:true, 267 type:'text' 268 } 269 ]; 270 }, 271 /** 272 * 每个组件,如果需要使用业务流的话,需要声明这个 273 */ 274 process:{ 275 /** 276 * 组件开始调用,业务流组件会调用这个接口来启用组件 277 */ 278 start:function () 279 { 280 this.render(); 281 }, 282 /** 283 * 组件结束调用,当这个业务结束的时候,业务流组件会调用它 284 */ 285 end:function () 286 { 287 $(this.el).empty(); 288 }, 289 /** 290 * 组件检测是否可以进行下一步 291 * 当组件需要进入下一步时,业务流组件将会调用这个接口, 292 * 这个接口需要通过 this.notify("goNext") 来通知业务流组件它检测通过, 293 * 否则业务流组件在这个地方会停滞下来 通过 this.notify("pause")来通知 294 */ 295 checkSucc:function () 296 { 297 if(this.form.valid()){ 298 this.notify("goNext"); 299 } 300 } 301 }, 302 events:{ 303 } 304 }); 305 306 });