如何在View - Ember中获得点击元素模型

时间:2014-05-15 09:23:25

标签: javascript ember.js

我有一个行数div的视图。单击div时,应选择当前单击的元素。以下是我使用的代码。

{{#each}} 
    <div {{action target="view" on="click" allowedKeys="shift"}} {{bind-attr class=':user isActive'}} > 
        {{test}}
    </div>
{{/each}}

我的观点由模型支持:

model: function() { 
    return [{'test':'1'}, {'test' :'2'}, {'test': '3'}, {'test': '4'}]; 
}

在我看来,我处理了点击处理程序。

click: function( e ) { 
    if( e.shiftKey ){
        this.modelFor("index").send('changeBgSelection', {'test' :'2'} ); // Here I could not get the current clicked elements model.
    }

    // Here I need to get the current clicked elements model. When I click the second element I need to get as  "{'test' :'2'}". But I could not get the current elements model. Instead I can get the whole model.

}

在我的路线中, 点击的元素在此处激活。

actions:{
    changeBgSelection: function (params) { 
        var select = this.get("controller").objectAt(this.modelFor("index").indexOf(params)); 
        select.set('isActive', true)
    }
}

那么如何在我的视图中获取当前点击的元素模型?这样我就可以将模型传递给我的Route,按下Shift键激活点击的div。

编辑:Jsbin Link

1 个答案:

答案 0 :(得分:0)

在Ember中有两种方法可以响应鼠标:

  • 致电行动
  • 在视图中处理

似乎你试图将两者结合起来,它变得一团糟。我确定有办法让它发挥作用,但我无法找到它。相反,请允许我提出一个替代方案。

一般情况下,如果有一些奇怪的事情正在进行javascript或事件处理(如示例中的SHIFT键),我喜欢在本地化视图中处理它。在这里,每个&#39; TestView&#39;绑定到单个模型实例,它根据用户输入进行操作。

  <script type="text/x-handlebars" data-template-name="index">
    {{#each}}
      {{#view App.TestView content=this}}
        {{this.test}}
      {{/view}}
    {{/each}}
  </script>
App = Ember.Application.create();

function wrap(ob) {
  return Ember.Object.create(ob);
}

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return [
      wrap({'test':'1', 'isActive':false}),
      wrap({'test' :'2', 'isActive':false}),
      wrap({'test': '3', 'isActive':false}),
      wrap({'test': '4', 'isActive':false})
    ];
  }
});

App.TestView = Ember.View.extend({
  classNames: ["user"],
  classNameBindings: ["content.isActive:is-active"],
  click: function(e) { 
    if (e.shiftKey) {
      this.get("content").toggleProperty("isActive");
    }
  }
});

这可以清理一些,但你得到了要点。现场演示here