Ember.js 使用getJSON获取数据的模板中的条件

Ember.js 使用getJSON获取数据的模板中的条件,ember.js,ember-cli,handlebars.js,Ember.js,Ember Cli,Handlebars.js,我正试图弄明白如何做一些非常简单的事情:在模板中使用条件语句,并使用getJSON获取数据。我需要根据JSON散列中的类型键显示信息。作为一个例子,我已经包括了我想做什么的哈佛商学院文件。余烬之路是什么™ 要做到这一点 公司路线: // routes/company.js import Ember from 'ember'; export default Ember.Route.extend({ model: function(params) { return thi

我正试图弄明白如何做一些非常简单的事情:在模板中使用条件语句,并使用getJSON获取数据。我需要根据JSON散列中的
类型
键显示信息。作为一个例子,我已经包括了我想做什么的哈佛商学院文件。余烬之路是什么™ 要做到这一点

公司路线:

// routes/company.js

import Ember from 'ember';

export default Ember.Route.extend({
    model: function(params) {
        return this.store.findRecord('company', params.company_slug);
    },
    setupController: function(controller, model) {
        this._super(controller, model);

        Ember.$.getJSON('/companies/%@/events.json'.fmt(model.get('slug'))).then(data => {
            controller.set('events', data);
        });
    }
});
<ul class="test">
    <li>lol</li>
    {{#each events as |event|}}
        <li class="{{event.type}}">
            {{event.title}}

            {{!-- This code will obviously not work: --}}
            {{#if event.type == 'company_event'}}
               show company event stuff
            {{/if}}
            {{#if event.type == 'user_event'}}
               show user event stuff
            {{/if}}

        </li>
    {{/each}}
</ul>
[
    {
        title: "test test test",
        type: "company_event",
        date: "2015-10-14T00:00:00.000+02:00"
    }
]
我想做的公司展示模板:

// routes/company.js

import Ember from 'ember';

export default Ember.Route.extend({
    model: function(params) {
        return this.store.findRecord('company', params.company_slug);
    },
    setupController: function(controller, model) {
        this._super(controller, model);

        Ember.$.getJSON('/companies/%@/events.json'.fmt(model.get('slug'))).then(data => {
            controller.set('events', data);
        });
    }
});
<ul class="test">
    <li>lol</li>
    {{#each events as |event|}}
        <li class="{{event.type}}">
            {{event.title}}

            {{!-- This code will obviously not work: --}}
            {{#if event.type == 'company_event'}}
               show company event stuff
            {{/if}}
            {{#if event.type == 'user_event'}}
               show user event stuff
            {{/if}}

        </li>
    {{/each}}
</ul>
[
    {
        title: "test test test",
        type: "company_event",
        date: "2015-10-14T00:00:00.000+02:00"
    }
]

我可以想到两个建议:

1. 2.a<代码>{{component}} 您将有一个
company\u事件
和一个
user\u事件
组件(您需要对名称进行dasherize以符合命名规则),并执行以下操作:

{{component event.type event}}
2.b。将其包装在组件中 组件的另一种可能性是将整个组件封装在一个组件中,并使用计算属性:

{{#each events as |event|}}
  {{li-event event=event}}
{{/each}}

// components/li-event.js
export default Ember.Component.extend({
  tagName: "li",
  classNameBindings: ['event.type'],

  isCompanyEvent: Ember.computed.equal('event.type', 'company_event'),
  isUserEvent: Ember.computed.equal('event.type', 'user_event')
});

// templates/components/li-event.js
{{event.title}}

{{#if isCompanyEvent}}
  show company event stuff
{{/if}}
{{#if isUserEvent}}
  show user event stuff
{{/if}}

选择哪个选项留给读者作为练习;)

我可以想到两个建议:

1. 2.a<代码>{{component}} 您将有一个
company\u事件
和一个
user\u事件
组件(您需要对名称进行dasherize以符合命名规则),并执行以下操作:

{{component event.type event}}
2.b。将其包装在组件中 组件的另一种可能性是将整个组件封装在一个组件中,并使用计算属性:

{{#each events as |event|}}
  {{li-event event=event}}
{{/each}}

// components/li-event.js
export default Ember.Component.extend({
  tagName: "li",
  classNameBindings: ['event.type'],

  isCompanyEvent: Ember.computed.equal('event.type', 'company_event'),
  isUserEvent: Ember.computed.equal('event.type', 'user_event')
});

// templates/components/li-event.js
{{event.title}}

{{#if isCompanyEvent}}
  show company event stuff
{{/if}}
{{#if isUserEvent}}
  show user event stuff
{{/if}}

选择哪个选项留给读者作为练习;)

我可以想到两个建议:

1. 2.a<代码>{{component}} 您将有一个
company\u事件
和一个
user\u事件
组件(您需要对名称进行dasherize以符合命名规则),并执行以下操作:

{{component event.type event}}
2.b。将其包装在组件中 组件的另一种可能性是将整个组件封装在一个组件中,并使用计算属性:

{{#each events as |event|}}
  {{li-event event=event}}
{{/each}}

// components/li-event.js
export default Ember.Component.extend({
  tagName: "li",
  classNameBindings: ['event.type'],

  isCompanyEvent: Ember.computed.equal('event.type', 'company_event'),
  isUserEvent: Ember.computed.equal('event.type', 'user_event')
});

// templates/components/li-event.js
{{event.title}}

{{#if isCompanyEvent}}
  show company event stuff
{{/if}}
{{#if isUserEvent}}
  show user event stuff
{{/if}}

选择哪个选项留给读者作为练习;)

我可以想到两个建议:

1. 2.a<代码>{{component}} 您将有一个
company\u事件
和一个
user\u事件
组件(您需要对名称进行dasherize以符合命名规则),并执行以下操作:

{{component event.type event}}
2.b。将其包装在组件中 组件的另一种可能性是将整个组件封装在一个组件中,并使用计算属性:

{{#each events as |event|}}
  {{li-event event=event}}
{{/each}}

// components/li-event.js
export default Ember.Component.extend({
  tagName: "li",
  classNameBindings: ['event.type'],

  isCompanyEvent: Ember.computed.equal('event.type', 'company_event'),
  isUserEvent: Ember.computed.equal('event.type', 'user_event')
});

// templates/components/li-event.js
{{event.title}}

{{#if isCompanyEvent}}
  show company event stuff
{{/if}}
{{#if isUserEvent}}
  show user event stuff
{{/if}}

选择哪个选项留给读者作为练习;)

事件定义为余烬对象,以便您可以在其上定义计算属性:

var eventObject = Ember.Object.extend({
  isCompanyEvent: Ember.computed.equal('type', 'company_event')
});
在事件中读取时,生成余烬对象:

Ember.$.getJSON('/companies/%@/events.json'.fmt(model.get('slug'))) . 
  then(data => controller.set('events', data.map(event =>
    eventObject.create(event)));
然后

Mustache和Handlebar的开发人员有一个清晰的哲学观点,即业务逻辑——他们广义地定义了业务逻辑——不属于模板。他们的想法是“你准备数据,我把它抽出来”。他们的目标首先是保持模板简单易读,但更重要的是将业务规则放在一个地方——最常见的是放在控制器的等效位置。例如,事实上,
事件
对象的
类型
属性可能有一个值
“company\u event”
,该值具有一些特定的语义,在这个视图中是多种业务逻辑,因此不属于模板中的,模板的任务是生成一些HTML。换言之,这些开发人员希望避免这样一种情况:对接口的每一次更改都需要在n个不同的地方更改n个不同的东西。当然,没有一个开发人员愿意通过模板来寻找各种清单常量用来表示神奇事物的地方。这个问题更为相关,因为使用JS代码,我们可以在模型、控制器或对象中轻松添加逻辑,以检测和报告
类型
等字段的无效值,程序员向模板添加此类错误检测逻辑更难,而且在实践中并不常见;如果他们这样做了,就很难将错误输出定向到任何有意义的地方。换言之,模板没有与断言等价的
assert


这是一个非常冗长的说法,像“灰烬真相助手”这样的东西是一个可怕的想法。前进两步,后退一步。在人们开始使用模板分离逻辑和内容十多年后,逻辑在新的余烬助手(Ember helpers)的纵容下悄悄地回到了内容中,这种新的助手允许像
{{if}这样的事情(eq

事件定义为余烬对象,以便可以在其上定义计算属性:

var eventObject = Ember.Object.extend({
  isCompanyEvent: Ember.computed.equal('type', 'company_event')
});
在事件中读取时,生成余烬对象:

Ember.$.getJSON('/companies/%@/events.json'.fmt(model.get('slug'))) . 
  then(data => controller.set('events', data.map(event =>
    eventObject.create(event)));
然后

Mustache和Handlebar的开发人员有一个清晰的哲学观点,即业务逻辑——他们广义地定义了业务逻辑——不属于模板。他们的概念是“你准备数据,我把数据输出”。他们的目标首先是保持模板简单易读,但更重要的是将业务规则保存在一个地方——最常见的情况是在控制器的等效位置。例如,
事件
对象的
类型
属性的值可能为
“company\u event”
有一些特定的语义,在这个视图中,它是多种业务逻辑,因此不属于模板中的,模板的工作是生成一些HTML。换言之,这些开发人员希望避免这样一种情况,即对一个接口的每一次更改都需要在n个不同的位置更改n个不同的东西位置。当然,没有开发人员希望通过模板来寻找各种清单常量用于表示神奇事物的位置。问题更为相关,因为使用JS代码,我们可以轻松地在模型、控制器或对象中添加逻辑,以检测和报告字段(如
type)的无效值