Emberjs + Handlebars + Object onchange 和事件

Posted

技术标签:

【中文标题】Emberjs + Handlebars + Object onchange 和事件【英文标题】:Emberjs + Handlebars + Object onchange and events 【发布时间】:2012-02-26 22:50:28 【问题描述】:

我发现 jQuery 观察者没有绑定到把手逻辑中未显示的元素。

假设我有以下内容;

#if person
  Welcome back, <b>person.firstName person.lastName</b>!
else
  Please <a class="login">log in</a>.
/if

<script>
$('.login').click(function() 
    alert("Hi there.");
);
</script>

如果我在控制台中运行,person = null(或任何需要说服那个人是空的) - 登录观察者不起作用。我已经在使用 embers didInsertElement() 来加载其他一些东西,但是有没有我可以挂钩的“onChange”事件,以便我可以重新绑定事件观察者?

【问题讨论】:

【参考方案1】:

最大的问题是为什么你想要那个? Ember 对点击处理程序具有出色的内置支持,无需通过 jQuery。 &lt;script&gt; 不起作用的原因很可能是 ember 将视图插入 DOM 的延迟方式。当您执行 Ember.View.append() 时,该元素稍后会插入到 DOM 中。

也就是说,这里有一个小提琴,我认为你想要在 didInsertElement() 中附加 jQuery 点击处理程序。

http://jsfiddle.net/algesten/5LPPz/1/

didInsertElement: function () 
    // appending click handler directly with jQuery
    $('.login').click(function() 
        alert("Hi there.");
    );

然而,ember 方法是只使用 click 隐式处理函数:

http://jsfiddle.net/algesten/5LPPz/2/

click: function () 
    alert("Hi there.");

注意后一个处理程序附加到周围的车把div 而不是a,但点击气泡。

【讨论】:

嗨,迈克尔。我认为你没有理解我的问题。我发现事件处理程序仅适用于可见的部分。以我的第一个例子..如果人存在并返回true,我还有一个jQuery观察者,它像这样触发$('.login).click(),它加载在didInsertElement()上。现在 - 通过 webkit 控制台将 person 更改为 false 并尝试单击链接。它不会触发。【参考方案2】:

您面临的问题是 javascript 只能绑定到 dom 中存在的元素。添加新元素后,它希望您重新绑定这些事件。幸运的是,jQuery 是你的朋友。

<script>
$('body').on('click', '.login', function() 
    alert("Hi there.");
);
</script>

理想情况下,您的选择器是最接近 .login 的父级,不会被 javascript 添加。如果您不确定,以上是安全的选择

【讨论】:

以上是关于Emberjs + Handlebars + Object onchange 和事件的主要内容,如果未能解决你的问题,请参考以下文章

在 emberjs 中访问 #each 中的索引

Emberjs - 使用专注于自身的 Views/Handlebar Helpers 创建一个按钮

使用 handlebars.js 模板以数组中的最后一项为条件

如何在 Ember JS 中获取模型数据

将 ember-view 渲染到定义的容器中

emberjs 和 Foundation4