Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关联和grailswebflow_Javascript_Grails_Groovy - Fatal编程技术网

Javascript 关联和grailswebflow

Javascript 关联和grailswebflow,javascript,grails,groovy,Javascript,Grails,Groovy,这是我第一次在Grails中使用webflows,我似乎无法解决这个问题 我有3个域类,它们的关联如下: class A { ... static hasMany = [ b : B ] ... } class B { ... static belongsTo = [ a : A ] static hasMany = [ c : C ] ... } class C { ... static belongsTo = [ b : B ] ... } de

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

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

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

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

class C {
  ...
  static belongsTo = [ b : B ]
  ...
}
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
   ...
}
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")
      ...
   }
   ...
}
现在,GSP通过Javascript与控制器通信(由于我使用了Dojo)。当我尝试执行正常操作时,我可以执行以下操作:

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

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

class C {
  ...
  static belongsTo = [ b : B ]
  ...
}
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
   ...
}
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")
      ...
   }
   ...
}
但是,我有一个webflow,该操作的内容在webflow中。。。它看起来像这样:

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

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

class C {
  ...
  static belongsTo = [ b : B ]
  ...
}
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
   ...
}
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都到不了。有什么建议吗???
谢谢变得非常绝望…

嗯,我不太确定问题出在哪里,但我确实发现了一些奇怪的事情。在第一个块中,使用以下命令:

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

我不知道如果currA.b是空的会发生什么。。。考虑到安全操作符,它将空与空等同(通过GroovyTruth),我认为示例将为空

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

进一步来看,您似乎还缺少了“to”函数调用:

on("event") { intraEvent code }.**to** "eventHandlerAction"
也许你看到的错误就是这样的结果

似乎不是

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

def goGetC() {      
   def anId = params.id 
   def currA = A.get(anId) 
   def sample = currA.b 
}
为了从事件代码中调用该方法,您必须使用:

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

如果您试图在不使用“this.”的情况下调用goGetC(),那么您的eventhandler将以事件“goGetC”结尾。我不确定您对真实代码的简化是否隐藏了类似的情况,我也不确定您到底遇到了什么错误,但这是前一段时间咬我的东西,它是特定于流的。希望这能有所帮助。

Oops,对不起,当我试图从实际代码中概括我的代码时,会发生这种情况:D谢谢你指出这一点。嗯,现在(为了简化它),让我们说只有1b(我稍后会担心B的集合…),但定义仍然成立。大多数情况下,错误是由流生成的(关于空映射),因此我认为这是一个单独的问题。然而,我认为更恰当的说法是,在那一行,B在webflow中返回为null。。。如果我将此函数放在webflow之外(如示例“action1”,它不是空的),我注意到在流中(出于某些原因)有许多关系的实现会有所不同……特别是,在请求之间从流作用域上取下对象时。我会注意到,我已经确定要完全加载的hasMany集合(不懒惰)在将其放入作用域之前,将还原为一个特殊的实现列表,而不仅仅是当我将其从作用域中拉出时的ArrayList。检查currA.b是什么实际的实现类型,并尝试在尝试达到c之前转换为a实际的b?我在上面的回答中添加了一些内容…您是否缺少“to”事件描述符的一部分?嗨,比尔,再次感谢你的回复。事实上,是的,我确实注意到返回的集合是PersistentSet类型(或类似的类型)。我将尝试转换它并返回给你。是的,实际代码有“to”第四部分:D在这里错过了这一个…再次谢谢你指出这一点!如果它在webflow中,我看不出它是什么类型…即使我做了一个急切的获取,B仍然返回为null。另一方面,如果它在action1中,它的类型是B。。。