我正在使用Cordova 6.5 ,Ionic 3.1.1 和MObileFirst Foundation 8.0(服务器: 8.0.0.00-20170220-1900 和客户端SDK: 8.0.2017033009 )。我使用离子的离子列表创建了一个Yes / No单选按钮,如下所示:
list.html
<form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm.value)">
<ion-list radio-group formControlName="wsQuestion1">
<ion-item>
<ion-label>Yes</ion-label>
<ion-radio value="1"></ion-radio>
</ion-item>
<ion-item>
<ion-label>No</ion-label>
<ion-radio value="0"></ion-radio>
</ion-item>
</ion-list>
<button type="submit" >Submit</button>
</form>
以下是我用于登录的代码:
WLAuthorizationManager.login('UserLogin', data).then(
() => {//success handler
this.openNextPage();
},
() => {//failure handler
console.log("Error handler");
alert('ALERT_ERR_REQUEST_PROCESSING_FAILED');
}
);
如果我从&#34;菜单 - &gt;导航到此页面列表&#34;然后我可以在是/否之间切换,并且定量按钮被选中。但如果我输入用户名/密码,请单击登录,然后当我在身份验证后到达此页面时,我无法在比率按钮之间切换。
我创建了一个可以重现此场景的应用。你可以得到它here。
执行以下操作以重现:
答案 0 :(得分:1)
问题是由离子代码中的线程计时引起的。已经提出了一个问题,可以在此处找到:https://github.com/driftyco/ionic-native/issues/1547。作为临时解决方法,可以在函数&#34; checkandupdateview&#34;中添加2毫秒的小超时。确保视图正确更新。
<强>更新强> 无论离子是否接受,该问题仍然与MFP无关。这是一个线程时间,任何插件都可能发生,不一定只有MFP。不过,这里有一个解决方法,只在 离子代码 中使用小超时运行代码。
修改&#34; checkandupdateview&#34;你的main.js中的离子函数(将在build文件夹中)到下面的代码片段。正如您所看到的那样,它是为离子的视图渲染添加一个小暂停。
function test2()
{
setTimeout(function(){
}, 1);
}
/**
* @param {?} view
* @return {?}
*/
function checkAndUpdateView(view) {
try{
if( view.component.navCtrl._ids == 1 && view.component.navCtrl.id == "n4"
)
{
test2();
}
}catch(e){}
Services.updateDirectives(view, 0 /* CheckAndUpdate */);
execEmbeddedViewsAction(view, ViewAction.CheckAndUpdate);
execQueriesAction(view, 33554432 /* TypeContentQuery */, 268435456 /* DynamicQuery */, 0 /* CheckAndUpdate */);
callLifecycleHooksChildrenFirst(view, 1048576 /* AfterContentChecked */ |
(view.state & 1 /* FirstCheck */ ? 524288 /* AfterContentInit */ : 0));
Services.updateRenderer(view, 0 /* CheckAndUpdate */);
execComponentViewsAction(view, ViewAction.CheckAndUpdate);
execQueriesAction(view, 67108864 /* TypeViewQuery */, 268435456 /* DynamicQuery */, 0 /* CheckAndUpdate */);
callLifecycleHooksChildrenFirst(view, 4194304 /* AfterViewChecked */ |
(view.state & 1 /* FirstCheck */ ? 2097152 /* AfterViewInit */ : 0));
if (view.def.flags & 2 /* OnPush */) {
view.state &= ~2 /* ChecksEnabled */;
}
view.state &= ~1 /* FirstCheck */;
}
如果仍有问题,请退回。
谢谢!
答案 1 :(得分:0)
我将代码的登录部分更改为以下内容:
WLAuthorizationManager.login('UserLogin', data).then(
() => {//success handler
console.log("is angular zone ",NgZone.isInAngularZone());
this.ngZone.run(()=>{
console.log("is angular zone ",NgZone.isInAngularZone());
this.openNextPage();
});
},
() => {//failure handler
console.log("Error handler");
alert('ALERT_ERR_REQUEST_PROCESSING_FAILED');
}
);
它的行为是因为WLAuthorizationManager的“成功处理程序”在Angular Zone之外运行,这就是为什么没有检测到这些更改。
要解决这个问题,我已将“openNextPage”方法的调用包装成“this.ngZone.run(() => { ... })”,然后它就完美了。