1

我必须根据超过 4 行 groovy 代码的某些逻辑来显示复选框是否选中...我不喜欢在 GSP 页面中编写它..有任何 taglib 或某种方式我可以提取GSP 页面之外的逻辑。我可以在其中访问模型对象和请求对象。

4

4 回答 4

1

TagLib 是放置逻辑的好地方,您可以将所需的属性作为属性传递并进行测试:

class MyTagLib {
  static namespace = "my"

  def somecheckbox= { attrs ->
      def model = attrs.remove('model')
      if() { //tests goes here
          //you can also test if you need to mark the checkbox as checked
          if() {
              attrs.checked = "checked"
          }
          out << g.checkbox(attrs: attrs) //remaining attrs will be applied to the checkbox
      }
  }

}

我的视图.gsp

<my:somecheckbox model="${model}" name="checkboxname" value="${checkboxValue}" />
于 2013-04-15T23:59:12.017 回答
1

你有(至少)3个选项:

模型属性

如果您只是为单个页面或单个控制器执行复杂逻辑,请执行控制器方法中的逻辑并通过布尔值将布尔结果传递给视图:

// in your controller
def myAction() {
    [shouldDrawCheckbox: shouldDrawCheckBox(...)]
}

private boolean shouldDrawCheckBox(/* info for decision making */) {
    // decision making
}

服务方式

如果您要从多个控制器访问相同的逻辑,您可以将shouldDrawCheckBox方法提取到服务中,然后再次将结果传递给模型。

class MyController {
    def myService

    def myAction() {
        [shouldDrawCheckbox: myService.shouldDrawCheckbox(...)]
    }
}

class MyService {
    boolean shouldDrawCheckBox(...) {
        // logic!
    }
}

自定义标签库

如果您想避免通过模型传递决策,或者如果逻辑更普遍适用,您可以创建自定义标记库。

class MyTaglib {
    static namespace = "my"

    def myCheckbox = { attrs ->
        // extract decision info from the attrs
        // perform logic with info
        if (shouldDrawCheckbox)
            out << g.checkbox(attrs: attrs)
        }
    }
}

在您看来:

<my:myCheckbox whateverYourAttribsAre="value" name="..." value="..."/>
于 2013-04-16T14:29:56.710 回答
0

理想情况下,逻辑应该转到gsp 并在对象renders中设置标志的控制器。model如果 gsp 是模板的子级,则标志必须通过。当我们在 grails 中有适当的绑定框架时,​​视图层中的 DOM 操作并不理想。

于 2013-04-15T21:05:31.817 回答
0

使用g:命名空间。http://grails.org/doc/2.2.x/ref/Tags/checkBox.html

<g:checkBox name="myCheckbox" value="${condition}" />

没有比这更简单的了。所有的逻辑都应该在控制器内部完成。

您在页面上需要的所有数据都可以由控制器传递。只需返回一个Map.

class MyController {
    def index() {
        def someCondition = true
        [request:request, condition:someCondition]
    }
}
于 2013-04-15T21:05:50.643 回答