ajax调用后的奇怪结果。传递给gsp和奇怪的js语法错误时域类型更改。 Grails 2.3.7

时间:2015-06-26 18:14:29

标签: ajax grails

我有一个模板,它呈现域对象的所有hasMany属性(我们称之为foos,即使我很遗憾foo)以及域中不包含的那些foos的剩余数量。从模板中,您可以通过ajax调用使用加号和减号按钮在关系中添加或删除foos。但是......我得到了一些非常奇怪的行为。

第一次点击加号或减号按钮时,ajax调用工作正常,模型应该更新......但在此之后,一切都会中断。模板会再次呈现,但域中似乎缺少动作(以及它的foos)并且按钮不再起作用。 foos确实会从域中添加/删除并正确保存,但它不会反映在新渲染的模板中。

调试时我决定只在模板中显示域对象toString()并发现在第一次调用ajax之后它实际上从类型Domain更改为类型org.apache.catalina.core.ApplicationContextFacade。 WEIRD。

在尝试再次单击加号或减号按钮后,javascript控制台中出现一个神秘的语法错误:'未捕获的SyntaxError:意外的令牌',(索引):1。真正奇怪的部分是它位于文件的第一行......在DOCTYPE声明中......我检查过它,没有','就像SyntaxError说的那样,但是元素仍然有可怕的在它下面的红色波浪线。

任何人都可以帮我指出正确的方向吗?我一直被困在两天试图解决这个问题!

编辑:值得注意的是,我的应用程序的另一部分与此类似,但具有不同的域类,并且工作得很好..我已经花了很多时间在过去的两个天以确保它们在各方面都完全相同,除了正在使用哪些域....这只会增加这种无法工作的神秘感。

Domain.groovy

class Domain {
    static hasMany = [foos: Foo]
}

Foo.groovy

class Foo {
    static hasMany = [domains: Domain]
    static belongsTo = [Domain]
}

DomainController.groovy

def show(String id) {  
    Domain domain = domain.get(id)

    if (!domain) {
        response.sendError(404)
        return
    }
    [domain: domain, foos: Foo.list() - domain.foos] 
}

def fooToggle(String domainId, String fooId, String fooAction) {
    Domain domain = Domain.get(domainId)
    Foo foo = Foo.get(fooId)

     if (!domain || !foo) {
        response.sendError(404)
        return
     }
     else {  
        if (fooAction == "add") {
            domain.addToFoos(foo)
        }
        else if (fooAction == "remove") {
            domain.removeFromFoos(foo)
        }
        domain.save()
     }

    render template: "foos", model: [domain: domain, foos: Foo.list() - domain.foos]
}

show.gsp

<html>
<head></head>
<body>
    <div id="foos">
        <g:render template="foos" model="${[domain: domain, foos: foos]}" />
    </div>
</body>
</html>

_foos.gsp

<!-- this is where the type of Domain changes to org.apache.catalina.core.ApplicationContextFacade -->
<g:if test="${domain}">${domain}</g:if>

<g:if test="${domain.foos}">
    <small>Click the minus button to remove a foo from this domain</small>
    <g:each var="foo" in="${domain.foos}">
    <div id="foo${foo.id}" class="fooItem">
        <span>${foo.bar}</span>
        <img onclick="fooToggle(${domain.id}, ${foo.id}, 'remove')" class="fooButton" src="${fam.icon(name: 'delete')}"/>
    </div>
    </g:each>
</g:if>
<g:else>
    <p><small><em>This domain does not have any foos</em></small></p>
</g:else>

<g:if test="${foos}">
    <hr>
    <small>Click the plus button to add a foo to this domain</small>
    <g:each var="foo" in="${foos}">
    <div id="foo${foo.id}" class="fooItem">
        <span>${foo.bar}</span>
        <img onclick="fooToggle(${domain.id}, ${foo.id}, 'add')" class="fooButton" src='${fam.icon(name: 'add')}'/>
    </div>
    </g:each>
</g:if>

<script>
function fooToggle(domainId, fooId, fooAction) {
    $.ajax({
        url: '${g.createLink(controller: 'domain', action: 'fooToggle')}',
        data: {
            'domainId': domainId,
            'fooId': fooId,
            'fooAction': fooAction
        },
        success: function(resp) {
            $("#foo" + fooId).fadeOut("fast", function() {
                $("#foos").html(resp);
            }); 
        }
    });
}
</script>

1 个答案:

答案 0 :(得分:0)

事实证明application是一个JSP隐式对象。我的示例中的Domain.groovy实际上实际上命名为Application.groovy,而_foos.gsp中的相关变量确实命名为application。将变量名称更改为app(或任何非保留变量名称)是解决方案。

List of JSP Implicit Objects