2017-09-25 109 views
1

嘿,我正在开发一个角度为1.6的应用程序,并且我遇到了一个问题,我不太确定如何解决。这里简要讨论一下这个设置。该页面是一个包含30个问题的表单。客户端有很多条件逻辑如下:如果用户在Q1上选择“是”,然后向他们展示Q2-4,如果Q1上的“否”,则跳至Q5。这在三十个问题形式中重演。在AngularJS中更新屏幕视图

我遇到以下情况 - 如果用户在Q1上选择“是”,回答Q2-4,然后意识到Q1应该真的是“否”。

所以我的问题是:1)如何清除模型?和2)如何更新视图?因此,如果他们第三次决定,第一季度应该是肯定的,第二季度至第四季度是没有检查/清除/空白的。

为1),我只是写了一个简单的“clearAll方法如下:

function clearAll(arr){ 
     arr.forEach(function(element){ 
      if(element!==undefined){ 
       element = null; 
      }  
     }); 
    } 

这将清除模型,但不更新视图。如何更新视图以使Q2-4清除/清空/空白?

我不得不这样做是为了更新视图,所以

$scope.$watch(myModel, function(val){ 
    //set to null or delete? 
} 

但我不能一概而论这所以很灵活,可以接受一个数组。任何意见,将不胜感激。谢谢。

+0

分配功能'$ scope.'那么就会触发变化检测,或致电'$ scope.apply ()' – Akxe

+0

我们使用“controller as”语法,所以我宁愿避免范围。即使我想使用$ scope。$ apply(),它也会抛出与摘要循环相关的错误。 – jrDeveloper

+0

此外,根据条件决定在服务器端或发送期间保存什么,而不是清除,因此您不会遇到任何此类问题。 – Akxe

回答

1

为了您的具体问题,我会用UI的路由器和基于问题解决不同的状态,即state.questions,并采取不同的参数一样,如果你有网址/questions作为基地介绍页面(也许weclome到问题或某事),你将有/questions/1,这将是第一个问题/questions/2是第二等.. 然后保持一个对象名单上的一些简单的服务,即:

let questions = []; 

将整个应用程序仍然存在,后来一些充满对象如:

{ 
q1: { 
    answers: [1,2,3] 
}, 
{ 
q2: { 
    answers: [1,3] 
} 

您可以随时清除它,或者推送新的答案。你甚至可以在加载状态之前检查特定的答案,这会给你很大的灵活性,你真正想要的。

以及对丑陋的解决方案你看,如果你添加的钟表集团和超时也许可以工作:

$scope.$watchGroup(arrayOfModels, (newVal, oldVal)=>{ 
    if(newVal) { 
    // now do something you want with that models 
    // if they don't apply, try $timeout(()=> $scope.$apply()); 
    } 
}) 
+0

嗯谢谢你,但我只是建立在一些现有的遗留代码上,所以我只需要修复现有的生产问题。 : -/ – jrDeveloper

+0

正确地做它永远不会太晚:)解决一些变通办法的问题只是挖掘一个更深的洞。如果你需要不同的帮助,你可以发布一些你的代码,我们可以尝试帮助。 – pegla

+0

控制器中没有太多的代码。只需一个init,save和clearAll,但我同意w /您的意见。这是猴子修补。我怀疑正确的方法(考虑到我的时间限制)可能会做简要讨论的第二种方法:$ scope。$ watch(arrayOfModels,function(){//删除适当的模型});或类似的东西。 – jrDeveloper