Javascript 关联和grailswebflow
这是我第一次在Grails中使用webflows,我似乎无法解决这个问题 我有3个域类,它们的关联如下: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
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。。。