Combine linkTo and action helpers in Ember.js

2019-01-22 02:03发布

I need to combine linkTo and action helpers in Ember.js. My code is:

{{#link-to 'index'}}<span {{action 'clear'}}>Clear</span>{{/link-to}}

But I would like to make this something like this:

{{#link-to 'index' {{action 'clear'}} }}Clear{{/link-to}}

And also:

<li>
    {{#link-to 'support'}}
        <span {{action 'myAction' 'support'}}>Support</span>
    {{/link-to}}
</li>

To:

<li>
    {{#link-to 'support' {{action 'myAction' 'support'}} }}Support{{/link-to}}
</li>

How can I achieve this?

Solution

Check my answer for Ember 2.0 compatible, OK for SEO solution.

8条回答
戒情不戒烟
2楼-- · 2019-01-22 02:46

This is how I solved this in our demo application for the O'Reilly Ember.js book: https://github.com/emberjsbook.

You can see the complete source here: https://github.com/emberjsbook/rocknrollcall

In the view:

{{#if artistsIsChecked}}
  {{#if artists.length}}
    <h3>Artists</h3>

    <ul class="search-results artists">
      {{#each artists}}
        <li><a {{action 'viewedArtist' this.enid }}>{{name}}</a></li>
      {{/each}}
    </ul>
  {{/if}}
{{/if}}

And the controller:

App.SearchResultsController = Em.ObjectController.extend({
  actions: {
    viewedArtist: function(enid) {
      this.transitionToRoute('artist', enid);
    },
    viewedSong: function(sid) {
      this.transitionToRoute('song', sid);
    }
  },
  needs: ['artists', 'songs'],
  artistsIsChecked: true,
  songsIsChecked: true,
  artists: [],
  songs: []
});
查看更多
走好不送
3楼-- · 2019-01-22 02:47

None of these combinations will work in Ember.js, but you do not need to combine these two helpers. Why don't you just use action helper and let it bubble to controller or route? There you can use transitionToRoute in controller or transitionTo in route.

For example in controller you could have code like this:

App.PostsController = Ember.ArrayController.extend({
    clear: function () {
        // implement your action here
        this.transitionToRoute('index');
    }
});
查看更多
贼婆χ
4楼-- · 2019-01-22 02:50

Ember Link Action addon

I've developed this addon recently to address this with Ember 2.0 - 2.14+ compatible (1.13 also works!) style and taking advantage of closure actions/action names. This is OK for SEO!

Install addon

ember install ember-link-action

Usage

You can pass closure action as invokeAction param to {{link-to}} component:

{{#link-to 'other-route' invokeAction=(action 'testAction')}}
  Link to another route
{{/link-to}}

You can also use action name instead of closure action:

{{#link-to 'other-route' invokeAction='testAction'}}
  Link to another route
{{/link-to}}

To pass parameters to action you can use:

{{#link-to 'other-route' invokeAction=(action 'testAction' param1 param2)}}
  Link to another route
{{/link-to}}

Compatibility

Automated test suite confirms that addon works with 1.13 up to latest Ember 3 releases.

It works with a release, beta and canary versions of Ember.

Addon GitHub repository. Contributions are welcome.

查看更多
【Aperson】
5楼-- · 2019-01-22 02:54

This works fine in 1.6.0-beta.5:

<span {{action "someAction"}}>
  {{#link-to "some.route"}}
    Click Me
  {{/link-to}}
</span>

The link will happen and then the click will bubble up to the action handler. It's documented (albeit indirectly) here.

Edit: corrected syntax in opening link tag

查看更多
Anthone
6楼-- · 2019-01-22 02:54

Having the same problem, i found this simple solution:

{{#linkTo eng.rent class="external-button"}}<div class="internal-button" {{action "updateLangPath"}} >X</div>{{/linkTo}}

then, managing the css classes external-button and internal-button in the stylesheet, i made sure that the "internal-button" was covering the whole "external-button" area; in this way it is not possible to click on the external-button without clicking on the internal-button.

It works well for me; hope it can help...

查看更多
孤傲高冷的网名
7楼-- · 2019-01-22 03:03

I like Cereal Killer's approach for its simplicity, but unfortunately it exhibits a problem for me. When the browser navigates to another route, it restarts the Ember application.

As of Ember 2.6, the following simple approach does the trick:

<span {{action 'closeNavigationMenu'}}> {{#link-to 'home' preventDefault=false}} Go Home {{/link-to}} </span>

This achieves the following:

  • navigates to route 'home'
  • action 'closeNavigationMenu' is invoked
  • on mouseover, browser displays link that will be followed (for SEO and better UX)
  • browser navigation does not result in reboot of Ember app
查看更多
登录 后发表回答