2013-02-11 25 views
7

Tôi cần thiết lập mảng liên kết menu trong bộ định tuyến và sau đó hiển thị chúng trong mẫu bằng #each. Nhưng có vẻ như #linkĐể trợ giúp không nhận ra các biến. làm sao tôi có thể giải quyết việc này?Làm thế nào để sử dụng các biến chuỗi trong trình trợ giúp ember (linkTo hoặc một phần)?

Router:

Lite.DashboardRoute = Em.Route.extend({ 
    setupController: function(controller, model) { 
    this.controllerFor('application').set('mainControls', [ {path: 'widgets.new', name: 'Add', classes: 'btn btn-success icon-ok-sign'} ]) 
    } 
}) 

Liên kết render trong các ứng dụng mẫu:

{{#each link in mainControls}} 
    {{#linkTo link.route class=link.classes}} {{link.name}} {{/linkTo}} 
{{/each}} 

Thông báo lỗi:

ember.debug.js:51 Error: assertion failed: The route link.route was not found 

Ember phiên bản:

// Version: v1.0.0-pre.4 
// Last commit: 855db1a (2013-01-17 23:06:53 -0800) 
+0

Dường như trình trợ giúp 'linkTo' nhận ra đối số đầu tiên là tên tuyến chính xác, không phải tên biến .. –

+0

Có, nhưng làm cách nào tôi có thể hiển thị danh sách liên kết với các url khác nhau? – hoblin

Trả lời

7

Nếu bạn vẫn đang phải vật lộn với tùy chọn ken, bạn có thể muốn thử một cái gì đó như thế này:

{{#each link in mainControls}} 
    <a {{action "goToLink" link}} {{bindAttr class="link.classes"}}> 
     {{link.name}} 
    </a> 
{{/each}} 

Và sau đó bạn sẽ cần hàm goToLink để xử lý tác vụ. Bạn có thể đặt nó trên Bộ sưu tập của bạn, nhưng nếu bạn không, nó là vụ phải bong bóng lên đến xử lý tuyến đường của bạn, trong đó, về mặt lý thuyết, nên làm cho mọi việc thực sự dễ dàng:

App.MyRoute = Ember.Route.extend({ 
    // ... stuff ... 

    actions: { 
      goToLink: function(item) { 
       this.transitionTo(item.route); 
      } 
    } 
}); 

Bạn có thể đọc thêm về Hoạt động , ở đây: http://emberjs.com/guides/templates/actions/

cập nhật

tôi đã đặt cùng một fiddle cho bạn, sử dụng mới nhất và vĩ đại nhất Ember.

Tôi đã thực hiện một thay đổi nhỏ về đề xuất ở trên, do một số giới hạn kỹ thuật mà tôi đã phát hiện.

Cụ thể, Tuyến đường chỉ có vẻ như có thể xử lý các hành động cho các trình điều khiển được tạo trong nội bộ bằng Tuyến đường. Đây là một vấn đề đối với menu điều hướng của chúng tôi, vì bạn đang thay đổi tuyến đường, trong khi nó vẫn còn trên màn hình.

Nếu tôi chuyển sang sử dụng trình trợ giúp "hiển thị" Handlebars để hiển thị menu, không có Bộ định tuyến nào sẵn sàng xử lý tác vụ. Tuy nhiên, bộ định tuyến hiện tại dường như luôn được nối trong chuỗi bong bóng để gửi "" trên bộ điều khiển. Vì vậy, tôi chỉ có bộ điều khiển gửi một sự kiện lên chuỗi để Router, và chúng tôi nhận được hạnh phúc định tuyến của chúng tôi.

Bạn có thể tìm fiddle, ở đây: http://jsfiddle.net/Malkyne/fh3qK/

Cập nhật 2

Dưới đây là một phiên bản của fiddle cùng, chỉ với (thật là thú vị không có giấy tờ) ApplicationRoute được sử dụng để trực tiếp xử lý các hành động, nếu không có bộ điều khiển phải thực hiện bất kỳ chuyển tiếp nào: http://jsfiddle.net/Malkyne/ydTWZ/

+0

Bạn đã thực hiện một công việc ấn tượng để chỉ trả lời câu hỏi của ai đó. Thanks =) Nó, s giải pháp tốt, ít nhất nó tốt hơn sau đó một trong đó tôi sử dụng bây giờ (tôi render mỗi liên kết có thể với đường dẫn hardcoded bọc trong #if khối trong một phần). Dù sao, tôi sẽ thêm yêu cầu tính năng trên ember.js github để thêm hỗ trợ các tên biến cho người trợ giúp ember. Nhưng cho đến lúc đó tôi sẽ sử dụng giải pháp của bạn. Cảm ơn bạn lần nữa =) – hoblin

+0

Bạn có thể thêm lớp 'active' vào mục hiện tại không? –

+0

Willem, nó chỉ ra rằng có một tài sản thực sự tiện dụng (có thể không có giấy tờ) trên ** ApplicationController ** được gọi, thích hợp, ** currentPath **. Điều này chứa đường dẫn tuyến đường hiện tại của bạn. Bạn có thể tạo một MenuItemController với một nhu cầu **: ['application'] ** trong đó, và sử dụng bất kỳ logic nào trong đó bạn muốn tham khảo thuộc tính ** controllers.application.currentPath ** (như so sánh nó với tuyến đường của bạn giá trị). Tôi đã thực hiện một mod của fiddle trên cho bạn, vì vậy bạn có thể thấy điều này trong hành động: http://jsfiddle.net/Malkyne/fRsAv/ – Tess

4

Bạn không thể sử dụng biến bên linkto helper, bạn cần phải sử dụng bindAttr trên một thẻ neo thay

<a {{bindAttr href="link.route" class="link.classes"}}>link</a> 
+0

Tôi đã thử điều đó. Nhưng liên kết này không hoạt động như liên kết ember. Nó hoạt động giống như liên kết thông thường. – hoblin

+0

Bạn có ý nghĩa gì bởi liên kết ember, linkTo là một thẻ liên kết thông thường với sự hỗ trợ cho api vị trí. Miễn là bạn link.route được đặt đúng, liên kết sẽ hoạt động đúng. – ken

+0

Hãy xem nhận xét của tôi về [pastie] (http://pastie.org/6121367) – hoblin

1

Do Ember.js RC6, có thể định cấu hình Ember để tra cứu các tuyến dưới dạng thuộc tính thay vì diễn giải chúng dưới dạng giá trị mã hóa cứng. Tính đến RC6.1, điều này đòi hỏi một biến môi trường để được xác định:

ENV.HELPER_PARAM_LOOKUPS = true 

trước khi Ember.js được tải. Để biết thêm chi tiết, vui lòng xem yêu cầu kéo sau: Quoteless route param in linkTo performs lookup

Dưới đây là một ví dụ làm việc đầy đủ như là một jsFiddle:

Example: Using a variable in a #linkTo helper in Ember

0

chủ đề này không phải là quá gần đây và tôi không biết nếu hầu hết các phiên bản gần đây của Ember trình bày một giải pháp khác cho vấn đề này nhưng trên phiên bản Ember 1.11 nó hoạt động tốt.

Giải pháp là nội tuyến phiên bản link-to.

Nó hoạt động giống như trình trợ giúp (có, nó sẽ chuyển đổi lớp active cho bạn tùy thuộc vào tuyến đường hiện tại của bạn) và cho phép bạn chuyển các tham số động. Mô phỏng tình huống của tác giả, chúng ta sẽ có một cái gì đó như:

component.js

mainControls: [ 
    { path: 'widgets.new' }, 
    { name: 'Add' }, 
    { classes: 'btn btn-success icon-ok-sign' } 
] 

component.hbs

{{#each link in mainControls}} 
    {{link-to link.name link.route class=link.classes}} 
{{/each}} 

Chi tiết giáp phương pháp này có thể được tìm thấy here.

Các vấn đề liên quan