【问题标题】:Access Grails associated domain classes in controller or view?在控制器或视图中访问 Grails 关联的域类?
【发布时间】:2013-09-04 23:20:04
【问题描述】:

给定一个具有许多引用其他域类的字段的域类,最好的做法是访问控制器中的字段、将它们添加到模型中,还是直接在视图中访问这些字段?

换句话说,小型模型是否比简单视图更好,反之亦然?

例如:

// Controller
render(view: 'index', model: [b: a.b, c:a.b.c])

// View
${a}, ${c}, ${c.id}

对比。

// Controller
render(view: 'index', model: [a: a])

// View
${a.b}, ${a.b.c}, ${a.b.c.id}

此外,这些替代方案是否对 Grails / GORM 中的性能有影响?

【问题讨论】:

    标签: grails model-view-controller grails-orm


    【解决方案1】:

    我会说这完全取决于您的使用组织,但通常我会尽量减少每次渲染调用中模型中的条目数。

    如果您有一部分页面需要显示 a、a.b 和 a.b.c 的一部分,那么将它们作为对“a”的单个引用传递似乎没问题。

    如果您显示的页面有不同的部分,一个部分指向 a,另一个指向 ab,另一个指向 abc,那么我建议您查找模板 (http://www.slideshare.net/laelfrog/grails-layouts-sitemesh),并传递“a " 到顶部,然后将 "ab" 从该顶级页面传递到使用 ab 作为 "b" 的部分模板,等等。

    所以如果你的控制器有:

    render( view: 'index', model: [a:a] )
    

    index.gsp 可能看起来像:

    <g:render template="toplevel" model="[a: a]" />
    <g:render template="midlevel" model="[b: a.b]" />
    <g:render template="bottomlevel" model="[c: a.b.c]" />
    

    然后,在模板_toplevel中,你可以使用“a”(实际上,对于这个级别,传递模型是多余的,因为当前模型与控制器发送的模型相同)。

    但是在 _midlevel 中,您可以将“a.b”作为“b”访问,而在 _bottomlevel 中,您可以将 a.b.c 作为“c”访问。每个模板都应该知道它需要什么,并且应该为这些东西真正拥有自己的名称,而不是依赖于来自 2 个渲染链的模型。

    就优化而言,我怀疑这是个问题,除非您一遍又一遍地重新做大量工作来构建模型。仅仅取消引用孩子并不是真正的问题。

    【讨论】:

    • 我喜欢你建议的模板/模型模式。回复:性能我相当肯定控制器/服务和视图中的相同代码之间没有区别。也就是说,根据特定的域关系,多次调用a.b(尤其是a.bees)肯定会出现问题,在这种情况下,我们可能应该记住控制器中的字段访问。
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多