Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过本机选择元素更新belongsTo关系_Javascript_Ember.js - Fatal编程技术网

Javascript 通过本机选择元素更新belongsTo关系

Javascript 通过本机选择元素更新belongsTo关系,javascript,ember.js,Javascript,Ember.js,我一直在尝试将’s Ember Conf 2016 talk的详细信息合并到一个项目中,它正在处理以下示例中的简单属性名称是字符串数组,model.name是attr字符串: 模板: 并修改模板以调用此: <select onchange={{action "title" value="target.value"}}> {{#each titles as |title|}} <option value={{title.id}} selected={{eq title

我一直在尝试将’s Ember Conf 2016 talk的详细信息合并到一个项目中,它正在处理以下示例中的简单属性名称是字符串数组,model.name是attr字符串:

模板:

并修改模板以调用此:

<select onchange={{action "title" value="target.value"}}>
  {{#each titles as |title|}}
    <option value={{title.id}} selected={{eq title.id model.title.id}}>
      {{title.description}}
    </option>
  {{/each}}
</select>
然而,我需要为我想要以这种方式更新的每个关系创建一个函数


有没有一种方法可以直接从模板设置belongsTo关系,而无需调用中间函数或求助于附加组件?如果没有,那么是否有一种干燥的方法来解决这个问题?

经过几次尝试,并找到一个动作需要有多个参数,当其中一个参数通过value=属性设置时,这里是干燥的er解决方案:

组成部分:

模板:


但是,我仍在寻找一种不涉及在组件中定义操作的解决方案。

不幸的是,在我们拥有可路由组件之前,如果不从组件发送操作,就无法做到这一点。幸运的是,我们有ember route action helper来帮助我们,这可以作为可路由组件的垫片。-我知道您说过希望避免使用附加组件,但就我所知,这是目前唯一不涉及在组件中定义操作的解决方案。此外,它通常是一个非常有用的附加组件。我将它用于这个用例和其他用例。好处:当可路由组件特性落地时,您实际上不必进行任何重构。总之,我就是这样解决这个问题的:

您可以指定管线上的操作,并使用Mixin进行干燥。代替Mixin,您也可以只扩展路由并从中继承,或者重新打开路由。我反对重新开放这条路线,因为你们不太可能在每条路线上都需要这样做。避免肿胀

这个Mixin假设您的模型属性和它引用的belongsTo模型将始终具有相同的名称,因此只使用一个变量:property。如果不是这样,则需要添加另一个参数并将其传递给setBelongsTo,并指定用于set和peek记录的参数

在ember cli:2.13.2上测试并运行

选项1:本机选择方法

注意:需要ember route action helper附加组件

//模板/my-route.hbs {{每个标题作为|标题|} {{title.description}} {{/每个}} 选项2:余烬能量选择方法

注意:需要ember route action helper附加组件

如果使用余烬电源选择,则会出现一些细微差异

//模板/my-route.hbs {{电源选择 选项=标题 所选=model.title onchange=操作路由操作“setBelongsTo”模型“title” 作为|头衔| }} {{title.description}} {{/power select} 编辑1:OP使用ember truth helpers附加组件设置所选选项。或者OP为eq创建了自己的帮助器。这里的第一个解决方案也使用此附加组件

import Ember from 'ember';

export default Ember.Controller.extend({
  titles: null,
  init(){
    this.set( "titles", this.store.peekAll( "title" ) );
  }
});
<select onchange={{action (mut model.title) value="target.value"}}>
  {{#each titles as |title|}}
    <option value={{title}} selected={{eq title.id model.title.id}}>
      {{title.description}}
    </option>
  {{/each}}
</select>
actions: {
  title( id ){
    this.set( 'model.title', this.store.peekRecord( "title", id ) );
  }
}
<select onchange={{action "title" value="target.value"}}>
  {{#each titles as |title|}}
    <option value={{title.id}} selected={{eq title.id model.title.id}}>
      {{title.description}}
    </option>
  {{/each}}
</select>
actions: {
  updateValue( attr, model, id ){
    this.set( attr, this.store.peekRecord( model, id ) );
  }
}
<select onchange={{action (action "updateValue" "model.title" "title") value="target.value"}}>
  {{#each titles as |title|}}
    <option value={{title.id}} selected={{eq title.id model.title.id}}>
      {{title.description}}
    </option>
  {{/each}}
</select>
// mixins/my-mixin.js

import Ember from 'ember';

export default Ember.Mixin.create({
  actions: {
    setBelongsTo(model, property, value) {
      this.get('controller').get(model).set(property, this.store.peekRecord(property, value));
    }
  }
});
// routes/my-route.js

import Ember from 'ember';
import SetBelongsToMixin from 'myApp/mixins/set-belongs-to';

export default Ember.Route.extend(SetBelongsToMixin, {
  model() {
    return this.get('store')find(...);
  }
});
// mixins/my-mixin.js

import Ember from 'ember';

export default Ember.Mixin.create({
  actions: {
    setBelongsTo(model, property, value) {
      this.get('controller').get(model).set(property, value);
    }
  }
});
// routes/my-route.js

import Ember from 'ember';
import SetBelongsToMixin from 'myApp/mixins/set-belongs-to';

export default Ember.Route.extend(SetBelongsToMixin, {
  model() {
    return this.get('store')find(...);
  }
});