【问题标题】:Power-select not showing the selected value电源选择不显示所选值
【发布时间】:2017-04-25 19:22:29
【问题描述】:

我的电源选择不会显示选择的值。

我在这个组件中有三个电源选择,两个工作正常,但是第三个(companyType)表现得很奇怪——当你第一次进入表单时,这个值是空白的。当您选择一个值时,它会从那时起保留该记录(直到您刷新页面)

模板:

// templates/components/companies/edit-new-form.hbs
{{#bs-form formLayout=formLayout model=company onSubmit=(action "save") as |form|}}
    <label>State:
      {{#power-select
        selected=company.state
        options=states
        onchange=(action "chooseState")
        as |name|
      }}
        {{name}}
      {{/power-select}}
    </label>

    <label>County:
      {{#power-select
        selected=company.county
        options=countyNames
        onchange=(action "chooseCounty")
        as |name|
      }}
        {{name}}
      {{/power-select}}
    </label>

    <label>Company Type:
      {{#power-select class="select"
        selected=company.companyType
        options=companyTypes
        onchange=(action "chooseCompanyType")
        as |name|
      }}
        {{name.companyType}}
      {{/power-select}}
    </label>
{{/bs-form}}

JS:

// componnents/companies/edit-new-form.js
export default Ember.Component.extend({
  company: null,
  router: Ember.inject.service('-routing'),
  ajax: Ember.inject.service(),
  store: Ember.inject.service(),

  countyNames: Ember.computed('company.state', function() {
    return this.get('ajax').request(config.host + '/api/counties/' + this.company.get('state')).then( (json) => json.map( (county) => {
      return county.countyName;
    })
  )
}),

  states: ['AK', 'AL', 'AR', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'GA', 'HI', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA', 'MA', 'MD', 'ME', 'MI', 'MN', 'MO', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VA', 'VT', 'WA', 'WI', 'WV', 'WY'],

  actions: {
    // For dropdown handling
    chooseState(state) {
      this.set('company.state', state);
      //Ember.set(this, "counties", this.get('ajax').request(config.host + '/api/counties/' + state).then((json) => json.items));
      //this.set('counties', this.get('ajax').request(config.host + '/api/counties/' + state).then((json) => json));
    },

    chooseCounty(countyName) {
      this.set('company.county', countyName);
    },

    chooseCompanyType(companyType) {
      this.set('company.companyType', companyType);
    },

  }
});

这里是路线和模型钩子:

// routes/companies/edit.js
export default Ember.Route.extend({
  model(params) {
    var store = this.store;
    return Ember.RSVP.hash({
      companies: store.findRecord('company', params.company_id),
      companyTypes: store.findAll('companyType')
    });
  }
});

获取companyType模型的路径是:

// routes/company-types.js
export default Ember.Route.extend({
  model() {
    return this.get('store').findAll('company-type');
  }
});

还有我的模特:

// models/company.js
export default DS.Model.extend({
  companyName: DS.attr('string'),
  street: DS.attr('string'),
  county: DS.attr('string'),
  city: DS.attr('string'),
  state: DS.attr('string'),
  zip: DS.attr('string'),
  phone: DS.attr('string'),
  email: DS.attr('string'),
  fax: DS.attr('string'),
  companyType: DS.attr('string')
});

// models/company-type.js
export default DS.Model.extend({
  companyType: DS.attr('string')
});

查看 Ember Inspector,根据我的模型,companyType 的数据在那里并且是一个字符串。当我从下拉框中选择一个值时,数据类型变为&lt;svegbackend@model:company-type::ember1326:Environ Engineer。当我选择其他下拉列表之一时,该值保持为一个字符串,我认为这是有道理的,因为它们的源是字符串数组。

那么如何在表单加载时让下拉菜单显示值?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    问题在于,company 的 companyType 是字符串类型,而第三个选择的选项列表是 companyType 模型类型。这会在最初设置所选选项时造成不匹配。

    定义第三次幂选择如下:

    {#power-select class="select"
        selected=company.companyType
        options=companyTypesOptions
        onchange=(action "chooseCompanyType")
        as |name|
    }}
        {{name}}
    {{/power-select}}
    

    在edit-new-form.js中定义companyTypesOptions如下:

    companyTypesOptions: Ember.computed('companyTypes.[]', function() {
        return this.get('companyTypes').map((companyType)=> {
            return Ember.get(companyType, 'companyType');
        }); 
    })
    

    这样;您将制作选项列表和字符串类型的选定值!不要忘记选项的类型和你通过的选择是否不同;你会惹上麻烦的!尽量避免这种情况!

    【讨论】:

    • 谢谢,我想我知道你在做什么,但有两个问题。首先,非常轻微,this.get('company.companyType.id') 应该是 this.get('company.companyType')。这样可行!但第二个问题是,对于我之前犯的设计错误,这似乎是一个稍微复杂、不直观的解决方案。我应该怎么做?从模型中填充下拉列表并将其结果分配给另一个模型中的字段的简单标准方法是什么?
    • 你能发布你的模型吗?
    • 如果我能看到company 和companyType 的模型,我可以提供更好的帮助。
    • 我将模型添加到原始帖子中。谢谢。
    • @BradMathews 忘记了我最初写的内容。看到您的模型后,我已经更新了答案。这样就解决了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多