【问题标题】:Ember display model which has relationship in one componentEmber 显示模型,在一个组件中有关系
【发布时间】:2016-09-29 13:59:42
【问题描述】:

我想将我的模型公开给一个组件并显示在一个表格中。我希望这是模块化的,以便我可以将此组件用于其他模型。

我所做的具有一定关系的属性的方式没有显示出来。我发现的问题是,当我抓取它时,promise 尚未解决,并且我没有使用 {{ember-data}} 抓取属性。我想不出一种方法……我对 ember 真的很陌生,这对我来说是个问题……

更新

在阅读下面的所有描述之前,我想如果我可以将模型转换为一个数组就足够了。所以,我可以这样做:

{#each model as |item|}}
  <tr>
  {{#each item as |column index|}}
    <td>{{column.[index]}} &nbsp;</td>
  {{/each}}
  </tr>
{{/each}}

更新结束

我有以下两种型号

// #models/inventory-summary.js
export default DS.Model.extend({
    name: DS.attr('string'),
    total: DS.attr('number'),
    projects: DS.hasMany('inventoryProject'), //I WANT TO SHOW THIS GUY HERE
});
// #models/inventory-project.js
export default DS.Model.extend({
    name: DS.attr('string'), // IN PARTICULAR THIS ONE
    summary: DS.hasMany('inventorySummary'),
});

模板:

// #templates/inventory-summary.js
// here I'm sending the model to the component and mapping the attribute to something readable
{{model-table model=inventorySearchResult columnMap=columnMap}}

// #templates/components/model-table.hbs
// here is where I show the value of the model
{{#each model_table.values as |item|}}
   {{getItemAt item index}}
{{/each}}

我的助手

export function getItemAt(params/*, hash*/) {
    return params[0][params[1]];
}

在我的路线上我正在做:

// #routes/inventory-summary.js
model(params) {
    let query_params = {page_size: 100};
    if (params.page !== undefined && params.page !== null) {
        query_params['page'] = params.page;
    }
    return Ember.RSVP.hash({
        inventoryProject: this.get('store').findAll('inventoryProject'),
        inventorySummary: this.get('store').query('inventorySummary', query_params),
    });
},
setupController(controller, models) {
    this._super(...arguments);
    controller.set('projects', models.inventoryProject);
    controller.set('inventorySearchResult', models.inventorySummary);
    let columnMap = [
        ['name', 'Name ID',],
        ['total', 'Total'],
        ['projects', 'Project', {'property': 'name', 'has_many': true}]
    ];
    controller.set('columnMap', columnMap);
},

最后,这是代码中真正混乱的部分,这是我将要显示的值传递给模板的地方

// #components/model-table.js
getValueForColumn(values, params) {
    if (values.length > 0) {
        if (typeof values[0] === "object") {
            return this.getResolved(values, params);
        } else {
            return values;
        }
    }
    return values;
},
getResolved(promise, params) {
    let result = [];
    promise.forEach( (data) => {
        data.then((resolved) => {
            let tmp = "";
            resolved.forEach((item) => {
                console.log(item.get(property)); // THIS GUY SHOWS UP LATER
                tmp += item.get(property) + ", ";
            });
            result.push(tmp);
        });
    });
    return result; // THIS GUY RETURN AS EMPTY!
},
didReceiveAttrs() {
    this._super(...arguments);
    let model = this.get('model');
    let columnMap = this.get('columnMap');
    for (var i = 0; i < columnMap.length; i++) {
        attributes.push(columnMap[i][0]);
        columns.push({'name': columnMap[i][1], 'checked': true});
        values.push(this.getValueForColumn(model.getEach(columnMap[i][0]), columnMap[i][2])); //WRONG HERE
    }
    this.set('model_table', {});
    let model_table = this.get('model_table');
    Ember.set(model_table, 'values', values);
 },

如果我开始在 {{template}} 中执行一堆 if,我可以在模板中显示,因为我相信模板执行了某种我没有执行的绑定,它稍后会解决,但它确实是丑陋和讨厌。我想做一些更清洁的事情......这就是我在这里发帖的原因。

【问题讨论】:

    标签: javascript ember.js ember-data has-many ember-model


    【解决方案1】:

    将您的 api 调用移至 afterModel。 和 尝试这样的事情,等待承诺解决并设置它。

     afterModel: function () {
     var rsvp = Ember.RSVP.hash({
      obj1:    Ember.$.getJSON("/api/obj1"),
      obj2: Ember.$.getJSON("/api/obj2"),
    });
    var ret = rsvp.then(function (resolve) {
      console.log("Something" + resolve.obj1);
      self.set('obj2', resolve.obj2);
    
    });
    return ret;
    

    },

    setupController: function (controller, model) {
    this._super(controller, model);
    controller.set('obj1', this.get('obj1'));
    controller.set('obj2, this.get('obj2'));
    

    }

    【讨论】:

    • 似乎比使用 Ember.observer() 更好。我会看一看,很快就给回报......
    • 实际上这对我不起作用,因为我正在使用的组件没有 afterModel() 。我在model=inventorySearchResult 的模板中传递结果
    • 我猜你也可以在 model() 中做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多