使用MFP 8.0对用户进行身份验证后,无法在单选按钮之间切换

时间:2017-05-01 20:37:05

标签: ionic2 ibm-mobilefirst

我正在使用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

执行以下操作以重现:

  1. 下载,解压缩并导航到项目根目录
  2. 在命令提示符下运行npm install
  3. 在命令提示符下运行cordova platform add
  4. 在命令提示符下运行ionic serve
  5. 运行cordova run android
  6. 当设备上的应用程序打开后,输入(测试用户名/密码)
  7. 您可以尝试点击是/否按钮。
  8. 以下是它如何查看我的设备:

    enter image description here

2 个答案:

答案 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(() => { ... })”,然后它就完美了。