【问题标题】:Associations and the Grails webflow关联和 Grails webflow
【发布时间】:2010-04-27 17:21:47
【问题描述】:

这是我第一次在 Grails 中使用 webflow,我似乎无法解决这个问题。

我有 3 个域类,它们的关联如下所示:

class A {
  ...
  static hasMany = [ b : B ]
  ...
}

class B {
  ...
  static belongsTo = [ a : A ]
  static hasMany = [ c : C ]
  ...
}

class C {
  ...
  static belongsTo = [ b : B ]
  ...
}

现在,GSP 通过 Javascript 与控制器通信(由于我使用了 Dojo)。当我尝试 remoteFunction 一个正常的动作时,我可以这样做:

def action1 = {
   def anId = params.id
   def currA = A.get(anId)
   def sample = currA.b?.c // I can get all the way to 'c' without any problems
   ...
}

但是,我有一个 webflow,该操作的内容在 webflow 中......它看起来像这样:

def someFlow = {
   ...
   someState {
      on("next") {
         def anId = params.id // this does NOT return a null value
         def currA = A.get(anId) // this does NOT return a null value
         def sample = currA.b // error already occurs here and I need to get 'c'!
      }.to("somePage")
      ...
   }
   ...
}

在这种情况下,它告诉我 b 不存在......所以我什至无法到达 'c'。有什么建议可以做什么??? 谢谢……真的绝望了……

【问题讨论】:

    标签: javascript grails groovy


    【解决方案1】:

    嗯,不太确定问题出在哪里,但我确实发现了一些奇怪的东西。在您的第一个块中,您使用以下内容:

     def sample = currA.b?.c
    

    根据您创建的类,currA.b 是 B 的集合,而不是一个集合。因此 currA.b?.c 将是 C 类实例的集合的集合,currA.b 中的每个 B 都有一个集合

    我不确定如果 currA.b 为空会发生什么...鉴于安全运算符将空等同于 null(通过 GroovyTruth),我会说 sample 将为 null。

    但是,这些都不能帮助确定您指定的行生成错误的原因。也许你可以告诉我们错误是什么?是 NPE 还是其他?

    再看这个,看起来你还缺少“to”函数调用:

    on("event") { intraEvent code }.**to** "eventHandlerAction"
    

    也许您看到的错误是由此造成的?

    好像没有。

    好吧,我唯一能想到的另一件事是,不久前(我认为是 v1.1),他们做到了,所以你必须使用“this”。更多内部流程操作。本质上,为了访问控制器类级别的对象和方法,您需要输入“this”。在他们面前的访问。假设您想将您获得的 intraEvent 代码放入方法中:

    def goGetC() {      
       def anId = params.id 
       def currA = A.get(anId) 
       def sample = currA.b 
    }
    

    为了从您的事件代码中调用该方法,您必须使用:

       someState {
          on("next") {
             this.goGetC()
          }.to ("wherever")
       }
    

    如果您尝试在没有“this.”的情况下调用 goGetC(),那么您将使用事件“goGetC”结束您的事件处理程序。我不确定您对真实代码的简化是否隐藏了类似的情况,我仍然不确定您到底遇到了什么错误,但这是不久前让我感到痛苦的事情,而且它是特定于 Flow 的。希望这会有所帮助。

    【讨论】:

    • 哎呀,对不起,当我尝试从实际代码中概括我的代码时会发生这种情况:D 感谢您指出这一点。嗯,现在(只是为了简化),让我们说只有 1 个 B(我会担心 B 的集合稍后......)但定义仍然成立。大多数时候,错误是由流程(关于空地图)产生的,所以我认为这是一个单独的问题。但是,我认为更合适的说法是,在该行,B 在 webflow 内部返回为 null ...如果我将此函数放在 webflow 外部(如示例 'action1',它不是 null
    • 我注意到 hasMany 关系在流中的实现确实有点不同(出于某种原因)......特别是,在请求之间将对象打开和关闭流范围时。我会注意到一个 hasMany 集合,我在将它放置到范围之前确保完全加载(不是惰性)将恢复到一个特殊的实现列表,而不仅仅是 ArrayList 当我将它从范围中拉出来时。检查 currA.b 的实际实现类型是什么,并在尝试到达 c 之前尝试转换为实际的 B?
    • 我在上面的答案中添加了更多内容...您是否缺少事件描述符的“to”部分?
    • 嗨,比尔,再次感谢您的回复。实际上,是的,我确实注意到返回的集合是 PersistentSet 类型(或类似的类型)。我会尝试转换它并回复你。是的,实际的代码有“to”部分:D在这里错过了这个......再次嘿嘿再次感谢您指出这一点!
    • 如果它在 webflow 中,我看不到它是什么类型......即使我做了一个急切的提取,B 仍然返回为 null。另一方面,如果它在 action1 中,它的类型是 B...
    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2011-05-04
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多