基于布尔值过滤模板中的 Ember.js 数据

Posted

技术标签:

【中文标题】基于布尔值过滤模板中的 Ember.js 数据【英文标题】:Filtering Ember.js data in template based on boolean 【发布时间】:2014-03-26 22:13:12 【问题描述】:

我目前正在 Ember.js 上构建照片审批应用。模型中的照片默认为approved = true。在应用程序中,单击照片会切换此状态,因此可以快速将它们列入黑名单。

我想设置一些过滤和显示approved = trueapproved = falseall 照片的路线。

我的router.js

App.Router.map ->
  @resource "photos", ->
    @resource "photo",
      path: ":photo_id"
    # additional child routes
    @route "approved"
    @route "disapproved"\

我的photo.js 模特:

App.Photo = DS.Model.extend(
  name: DS.attr("string")
  description: DS.attr("string")
  image_url: DS.attr("string")
  approved: DS.attr("boolean")
)

这是问题代码所在,在我的photos_route.js

App.PhotosRoute = Ember.Route.extend(
  model: ->
    App.Photo.find()
)

App.PhotosApprovedRoute = Ember.Route.extend(
  model: ->
    @store.filter "photo", (photo) ->
      photo.get("approved")

  renderTemplate: (controller) ->
    @render "photos",
      controller: controller
)

App.PhotosDisapprovedRoute = Ember.Route.extend(
  model: ->
    @store.filter "photo", (photo) ->
      not photo.get("approved")
  renderTemplate: (controller) ->
    @render "photos",
      controller: controller
)

最后,这是我在templates 中显示内容的方式:

!-- application.hbs --
<header id="header">
  <h2>#link-to "index"Home/link-to</h2>

  <nav>
    <ul>
      <li>#link-to "photos"All photos/link-to</li>
      <li>#link-to "photos.approved"Approved/link-to</li>
      <li>#link-to "photos.disapproved"Disapproved/link-to</li>
    </ul>
  </nav>
</header>

<div id="content">
  outlet
</div>

!-- photos.hbs --
<h1>Photos</h1>
<ul>
  #each controller
    <li class="masonry-brick">
      <h3>Approved: approved</h3>
      input type="checkbox" checked=photoApproved class="toggle"
      #link-to "photo" thisname/link-to
      <img bind-attr src=image_url >
    </li>
  else
    <li>There are no photos.</li>
  /each
</ul>

outlet

如何重新调整我的 photos_routes.js 以获得所需的行为?

【问题讨论】:

【参考方案1】:

Store 上的filter function 有两个参数,一个是适配器用来过滤服务器端的查询,另一个是保持过滤器对新对象或修改对象有效(更新内存中的内容)的函数。您使用的函数签名看起来更像是用于数组的函数签名。

查看文档: http://emberjs.com/api/data/classes/DS.Store.html#method_filter

未经测试的路线版本:

App.PhotosApprovedRoute = Ember.Route.extend(
  model: ->
    @store.filter "photo", approved: true, (photo) ->
      photo.get("approved")
)

App.PhotosDisapprovedRoute = Ember.Route.extend(
  model: ->
    @store.filter "photo", approved: false, (photo) ->
      not photo.get("approved")
)

PS。这对我来说似乎有点多余。我认为第三个参数(谓词)可以通过查询推断出来......但这就是我根据文档理解它现在的方式。

【讨论】:

太好了,谢谢。除了 API 请求之外,这一切都有效:http://localhost:3000/api/hotos?approved=true — 它似乎从photos 中删除了p,但在我的任何代码中都没有'hotos' 的踪迹。将路线设为photos?disapproved 而不是photos/disapproved 会更好吗? 我会选择photos/disapporved,但我想这更多的是个人品味/偏好,每个团队都有不同的指导方针。这两种方式都不是很大。一般来说,我会使用查询字符串来过滤相同的内容。但是,如果用户将其视为单独的内容,则不同的 URL 是有意义的,我认为这里就是这种情况。 好像还有问题;我在控制台中收到了TypeError: Object Photo has no method 'eachRelatedType' 好像是一个单独的问题,你能再发一个问题或者给我更多的细节吗? 当然,这是新问题:***.com/questions/22051678/…

以上是关于基于布尔值过滤模板中的 Ember.js 数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥当值为假时我不能传递过滤数据(它是布尔值)

根据布尔值列表过滤列表

编译器会优化模板布尔值吗?

基于布尔值的 ListView 项目可见性

布尔值上的 ng-repeat 过滤器

如何使用 OData 筛选器筛选 Azure 表存储中的布尔值?