【问题标题】:Ember JS - Add select box option to URL string via Query ParamEmber JS - 通过查询参数向 URL 字符串添加选择框选项
【发布时间】:2017-12-07 10:34:51
【问题描述】:

我的表单中有一个选择框,我希望能够将选择用作查询参数,以便我可以根据其选择刷新模型。选择框来自this ember add-on。

{{#select-box/native value=sb name=module on-select=(action 'selected') class="form-control" as |sb| }}
          {{sb.option value='Select a Module:'}} {{sb.option value='Option1'}} {{sb.option value="Option2" }} {{sb.option value="Option3" }} {{sb.option value="option4" }}
        {{/select-box/native}}

“选定”操作只是将选项添加到变量中,以便稍后在 switch 语句中使用它:

selected(x) {
  module = x
},

我想在我的 URL 字符串中包含选择项(或选择项的表示),但我不知道怎么做。我在 URL 字符串中构建了其他输入,但它们都不是选择框。

我的路线上的 QueryParams 中有一个“模块”项,但它没有做任何事情,我怀疑我必须在“选定”操作中做一些事情,但我不确定是什么。

【问题讨论】:

  • 目前我的其他查询参数在路由中使用 refreshModel:true 选项定义。当我的表单提交时,参数值被传递到后端,查询结果填充用于报告的模型。当用户更改其中一个参数时,它会重新查询后端。我的问题是我无法将选择框选项的表示形式放入 URL 字符串

标签: ember.js ember-data


【解决方案1】:

我没有使用过你提到的插件,但这里是你可以使用普通<select> 的方法,所以只需弥合普通<select> 和你正在使用的插件之间的差距确保下面示例中的 status 变量会根据您在选择框中选择的内容而改变 - Ember 将完成剩下的工作。

如果您想根据从下拉列表中选择的状态值过滤用户列表,则可以使用以下配置:

// app/models/user.js

import DS from 'ember-data';

export default DS.Model.extend({
    name: DS.attr('string'),
    status: DS.attr('string')
});


// app/templates/users.hbs

<select onchange={{action (mut status) value="target.value"}}>
    <option value="" selected={{eq status ''}}>- All users -</option>
    <option value="active" selected={{eq status 'active'}}>Active</option>
    <option value="inactive" selected={{eq status 'inactive'}}>Inactive</option>
</select>

<ul>
    {{#each model as |user|}}
        <li>{{user.name}}, {{user.status}}</li>
    {{/each}}
</ul>


// app/controllers/users.js

import Controller from '@ember/controller';

export default Controller.extend({
    queryParams: ['status'],
    status: ''
});


// app/routes/users.js

import Route from '@ember/routing/route';

export default Route.extend({
    queryParams: {
        status: {
            refreshModel: true
        }
    },

    model(params) {
        var options = {};
        if (params.status) {
            options.status = params.status;
        }
        return this.get('store').query('user', options);
    }
});

它是如何工作的?

在控制器中,您定义了一个属性status,您也将其指定为一个查询参数(在 URL 中)。然后在路由中,您还将status 定义为一个查询参数刷新模型。在 model() 挂钩中,您提取参数并将其用于 Ember Data Store 的 query() 以在每次更改状态值时获取模型。您的路由 URL 将附加?status=...,并且您的服务器将收到类似于example.com/api/users?status=... 的请求。当然,你可以在model()钩子中配置options以不同的方式来格式化服务器的请求URL,但为了简单起见,我保持这样。

唯一可能令人困惑的是模板文件。除了{{eq status '...'}} 语法truth helper 只是简单地确定选项是否被选中之外,其余的选择只是旨在更改status 变量(深入解释here)。

【讨论】:

  • 感谢您的全面回答。如果我可能会问,在控制器中声明查询参数有什么作用?我把它们拿出来(因为我在项目早期遇到了基于控制器的参数的问题)并且更改下拉列表的选择仍然会刷新模型。
  • 我也把它们拿出来检查,它确实有效,你是对的。显式命名它们的目的是将查询参数实际绑定到具有相同名称的控制器的属性(如here 所述)。此外,它还允许您定义控制器应该期望的查询参数的类型。最后,Route 文档的this section 中的 cmets 也可能会有所帮助。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多