Ember.js 增量计算属性并在每次迭代中绑定到元素

Ember.js 增量计算属性并在每次迭代中绑定到元素,ember.js,Ember.js,我的目标是为select元素提供id,它迭代地位于 {{each}}助手 例如,第一个select应该具有id UDF_CHAR_1,第二个具有UDF_CHAR_2, 然后继续 我正在将计算属性绑定到select的id属性。 在计算属性中,我增加计数器。问题不是 通过迭代分配id,它将UDF_CHAR1分配给all 我猜computed属性只计算一次。它不是每次都被调用的 {{each}内的时间 请在此处查看: 有什么办法可以做到这一点 您应该从ArrayController的内容创建一个新集合

我的目标是为select元素提供id,它迭代地位于 {{each}}助手

例如,第一个select应该具有id UDF_CHAR_1,第二个具有UDF_CHAR_2, 然后继续

我正在将计算属性绑定到select的id属性。 在计算属性中,我增加计数器。问题不是 通过迭代分配id,它将UDF_CHAR1分配给all

我猜computed属性只计算一次。它不是每次都被调用的 {{each}内的时间

请在此处查看:


有什么办法可以做到这一点

您应该从ArrayController的内容创建一个新集合,该集合计算每个项目的id:

App.IndexController = Ember.ArrayController.extend({
  contentWithIds:function(){
    var content = this.get('content') || [];
    return content.map(function(item, index) {
      item.id = "UDF_CHAR" + (index + 1);
      return item;
    });
  }.property('content.[]'),
});

工作小提琴:

您应该从ArrayController的内容创建一个新集合,该集合计算每个项目的id:

App.IndexController = Ember.ArrayController.extend({
  contentWithIds:function(){
    var content = this.get('content') || [];
    return content.map(function(item, index) {
      item.id = "UDF_CHAR" + (index + 1);
      return item;
    });
  }.property('content.[]'),
});

工作小提琴:

我认为您很可能不希望使用id引用选定的元素,并且有一种更好的方法来完成您要做的事情。如果你用你想要完成的东西更新你的问题,或者问一个新的问题,也许我们可以帮助你以一种更符合框架的方式解决这个问题

但是,如果确实要执行此操作,可以使用控制器上的computed属性为每个选定项使用所需id更新每个项:

这将使用向模型数组中的每个元素添加id字段。然后,您将使用{{each}}辅助对象循环此annotatedItems computed属性,在本例中,id元素将作为item.id进行访问:

{{#each item in annotatedItems}}
  <select name="test" {{bind-attr id=item.id}} multiple>
    <option>{{item.title}}</option>
    <option>{{item.alias}}</option>     
  </select>
  <button name="button" {{action 'testClick'}}>Click</button>
{{/each}} 

我认为您很可能不希望使用id引用select元素,并且有一种更好的方法来完成您要做的事情。如果你用你想要完成的东西更新你的问题,或者问一个新的问题,也许我们可以帮助你以一种更符合框架的方式解决这个问题

但是,如果确实要执行此操作,可以使用控制器上的computed属性为每个选定项使用所需id更新每个项:

这将使用向模型数组中的每个元素添加id字段。然后,您将使用{{each}}辅助对象循环此annotatedItems computed属性,在本例中,id元素将作为item.id进行访问:

{{#each item in annotatedItems}}
  <select name="test" {{bind-attr id=item.id}} multiple>
    <option>{{item.title}}</option>
    <option>{{item.alias}}</option>     
  </select>
  <button name="button" {{action 'testClick'}}>Click</button>
{{/each}} 


为什么不使用模型的属性?:啊,你说得对。computed属性只调用一次,即使在循环中也是如此。从文档中:fullName函数将被调用一次,不管它被访问了多少次,只要它的依赖项没有被更改。一旦更新了firstName或lastName,以后的任何调用或绑定到fullName的任何内容都将包含新值@芬达:是的,我能。但这不是我的要求。我的问题是如何在循环中迭代地为元素分配id?为什么需要这样生成id?通常在使用Ember时,您不需要通过ID引用实际的DOM元素…我同意。。。我很难理解为什么这是必要的。为什么不使用模型的属性呢。computed属性只调用一次,即使在循环中也是如此。从文档中:fullName函数将被调用一次,不管它被访问了多少次,只要它的依赖项没有被更改。一旦更新了firstName或lastName,以后的任何调用或绑定到fullName的任何内容都将包含新值@芬达:是的,我能。但这不是我的要求。我的问题是如何在循环中迭代地为元素分配id?为什么需要这样生成id?通常在使用Ember时,您不需要通过ID引用实际的DOM元素…我同意。。。我不明白为什么这是必要的。你的回答满足了我的问题。谢谢。对不起,我同意我的问题不中肯。我在这里贴了一个新问题,我也照你说的做了。我还有另一个要求,即在我想要更改模型数据的操作中,比如item.id。如何在操作中访问该属性?您的回答满足了我的问题。谢谢。对不起,我同意我的问题不中肯。我在这里贴了一个新问题,我也照你说的做了。我还有另一个要求,即在我想要更改模型数据的操作中,比如item.id。我怎样才能在操作中访问该属性?我已经做了与您所说的相同的操作。我还有另一个要求,即在我想要更改模型数据的操作中,比如item.id。如何在操作中访问该属性?@Susai您可以在操作助手中传递参数:{{action someMethod param1 param2}。所以我猜在你的例子中应该是{{action testClick item.id}},我也试过同样的方法。请检查并指导我。我已经照你说的做了。我还有另一个要求,即在我想要更改模型数据的操作中,比如item.id。如何在操作中访问该属性?@Susai您可以在
e动作助手:{{action someMethod param1 param2}。所以我猜在你的例子中应该是{{action testClick item.id}},我也试过同样的方法。请检查并指导我。