【问题标题】:Ember can't iterate over model with array propertyEmber 无法使用数组属性迭代模型
【发布时间】:2018-02-24 11:28:30
【问题描述】:

我有一个模特,values.js:

import DS from 'ember-data';

export default DS.Model.extend({
    values: [
        { name: "Quality", isChecked: DS.attr('bool') },
        { name: "Inspiration", isChecked: DS.attr('bool') },
        { name: "Creativity", isChecked: DS.attr('bool') },
        { name: "Commitment", isChecked: DS.attr('bool') },
        { name: "Honour", isChecked: DS.attr('bool') }
    ]
});

passport-values.js 的路线中,我正在创建一个价值观模型:

import Ember from 'ember';

export default Ember.Route.extend({
    model () {
        return this.store.createRecord('values');
    }
});

我有一个组件,passport-basic.hbs

<h2>{{title}}</h2>
<p>{{content}}</p>
<form>
    <fieldset class="checkboxes">
        {{#each model as |value index|}}
            <label>{{input type="checkbox" onchange=(action "change") checked=value.isChecked name="value.name"}}{{value.name}}</label>
        {{/each}}
    </fieldset>
</form>

我从我的模板 passport-values.hbs 中使用它,并将我的模型传递给:

{{passport-basic title="" content="" model=values}}

在组件中,我尝试遍历模型中数组中的所有值,以显示带有名称和复选框的标签,该标签表示每个值的 isChecked 选项是否为真/假。我已经尝试了很多其他来源的想法,但我似乎无法完成这项工作。

感谢您的帮助,我对 Ember.js 还是很陌生,我想知道我是否缺少一些东西?

【问题讨论】:

    标签: arrays ember.js components ember-data


    【解决方案1】:

    模型并不意味着包含数据,它们定义了将 JSON 有效负载转换为记录的属性。

    属性用于将从服务器返回的 JSON 有效负载转换为记录,以及序列化记录以在修改后保存回服务器时使用。 https://guides.emberjs.com/v2.15.0/models/defining-models/#toc_defining-attributes

    如果您不需要持久化数据或者您只是在测试模板。您可以定义一个数组并将其作为模型传递给您的路线。

    import Ember from 'ember';
    
    export default Ember.Route.extend({
        values: [
          { name: "Quality", isChecked: false },
          { name: "Inspiration", isChecked: false },
          { name: "Creativity", isChecked: false },
          { name: "Commitment", isChecked: false },
          { name: "Honour", isChecked: false }
        ],
        model () {
          return this.get('values');
        }
    });
    

    编辑:作为更正,从技术上讲,您可以在没有数据库的情况下以这种方式创建记录,但您无法保存它。

    正确的语法应该是。

    import DS from 'ember-data';
    
    export default DS.Model.extend({
      quality: DS.attr('boolean'),
      inspiration: DS.attr('boolean'),
      honor: DS.attr('boolean'),
      creativity: DS.attr('boolean'),
      commitment: DS.attr('boolean')
    });
    

    【讨论】:

    • 好的,如果我需要持久化数据,我该怎么做呢?我目前正在考虑在路由中创建一个 Ember 对象?
    • 我想说这超出了这个问题的范围。但基本上您需要研究如何将数据保存到数据库并将其作为 JSON 提供。 Ember 可以暂时保存数据,但如果没有某种服务器端集成,则无法长期保存。 @奥利
    【解决方案2】:

    您可以按照 Defining ModelsFinding Records 的指南中的示例以您描述的方式迭代集合,并利用 Ember 的内置方法来持久化记录。

    您的价值模型应如下所示:

    import DS from 'ember-data';
    
    export default DS.Model.extend({
      quality: DS.attr('boolean'),
      inspiration: DS.attr('boolean'),
      honor: DS.attr('boolean'),
      creativity: DS.attr('boolean'),
      commitment: DS.attr('boolean')
    });
    

    然后在你的路线上,做

    import Ember from 'ember';
    
    export default Ember.Route.extend({
      model() {
        return this.get('store').findAll('value');
      }
    });
    

    您的模型挂钩将返回一组值,您可以按照您的描述将这些值传递给组件:

    {{passport-basic title="" content="" model=values}}
    

    您可以像这样在模板中使用值属性:

    {{#each model as |value|}}
      <p>{{value.honor}}</p>
    {{/each}}
    

    【讨论】:

    • 谢谢,我还在学习 Ember.js,所以这些东西会及时出现。 :)
    • 祝你好运,欢迎来到 Ember :D 这一切肯定会变得更容易。
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多