James
James

Reputation: 2293

Emberjs + Handlebars + Object onchange and events

I'm finding that jQuery observers aren't bound to elements that are not shown in handlebars logic.

Let's say I have the following;

{{#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>

If I run in console, person = null (or whatever's needed to convince that person is empty) - the login observer doesn't work. I'm already using embers didInsertElement() to load a few other things, but is there a "onChange" event I can hook into so I can rebind event observers?

Upvotes: 4

Views: 2220

Answers (2)

Brennan McEachran
Brennan McEachran

Reputation: 519

The problem your facing is that javascript can only bind to elements that exist in the dom. Once you add a new element it wants you to re-bind those events. Luckily, jQuery is your friend on this one.

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

Ideally, your selector is the closest parent to .login that doesn't get added by javascript. The above is safe bet if you're not sure

Upvotes: 1

Martin Algesten
Martin Algesten

Reputation: 13620

The big question is why you want that? Ember has excellent built in support for click handlers without going via jQuery. The reason your <script> is not working is likely to be down to the deferred way ember inserts views into the DOM. When you do Ember.View.append() the element is inserted in the DOM later.

That said, here's a fiddle that does what I think you want attaching the jQuery click handler in didInsertElement().

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

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

However the ember way would be to just use the click implicit handler function:

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

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

N.B. the latter handler attaches to the surrounding handlebar div and not the a, but clicks bubble.

Upvotes: 1

Related Questions