1

我有一个 emberjs 应用程序,一个人可以:

单击链接模式弹出更改内容单击离开模式保存更改

我创建了与此处描述的模式非常相似的模式,其中包含路线上的事件。我可以将 ember 对象解析到路由中,但似乎无法获取单击的 DOM 元素。我想获取单击的 DOM 元素,因为我需要它的位置。我想相对于单击的 DOM 元素定位一个弹出窗口。

我在 .hbs 文件中的操作如下所示:

<a {{action open option}} class='choose-template'>Choose Template</a>

这个动作是由一个路由处理的

events: {
  open: function(option) {

    this.controller.set('field_option', option);
    this.render('modal', // the view to render
      {
          into: 'application', // the template to render into
          outlet: 'modal'  // the name of the outlet in that template

      }
    );
  },

  close: function() {
    this.render('nothing',
      { into: 'application', outlet: 'modal' });
  }
}

我处理模型定位在App.ModalView.didInsertElement(). 在这里,我想使用链接 DOM 元素来使模态位置本身相对于单击的链接。

4

1 回答 1

2

如果您不拦截 a 中的action事件,view它们会一直冒泡到没有可用事件的路线。因此,为了让您的事件成为它起源的元素位置,您应该actionview.

因此,不要在您的事件处理程序中route创建它们view

例子:

App.ModalView = Ember.View.extend({
  open: function(event) {
    // here your then have access to your event

    // Example on getting the position
    var posX = this.$().position().left,posY = this.$().position().top;
    console.log((event.pageX - posX) + ' , ' + (event.pageY - posY));

    // and then you could invoke the functions you want on your controller by
    this.get('controller').send('open', andhereparameters);
  },

  close: function(event) {
    // here your then have access to your event
    // same as above
  }
});

更新:

还有一点需要注意,默认情况下,您的操作目标是控制器,因此如果您想以控制器为目标,view您应该定义它:

<a {{action open option target="view"}} class='choose-template'>Choose Template</a>

希望能帮助到你。

于 2013-08-26T18:32:10.967 回答