2013-07-15 45 views
9

Vì vậy, tôi có thiết lập sau đây.Cách tải partials/views/templates động trong Ember.js

Trên trang chính, danh sách các trình tạo đang được hiển thị dựa trên danh sách đến từ mô hình sử dụng dữ liệu lịch thi đấu.

Bây giờ khi một trong các liên kết máy phát được nhấp vào, một trang mới được hiển thị với một số trường nhập được tạo động dựa trên dữ liệu lịch thi đấu đó.

Cho đến thời điểm này mọi thứ hoạt động hoàn hảo.

Bây giờ khi tôi thay đổi giá trị của trường đầu vào trong trang máy phát (sau khi chọn một trong các trình tạo) để xem các thay đổi đang được cập nhật trong một số loại div xem trước ngay bên dưới trường nhập của tôi, thật dễ dàng. Tôi có thể sử dụng {{generatorFields.0.value}} để ràng buộc trường nhập đầu tiên, .1., V.v. cho đến khi tôi ràng buộc tất cả chúng. Tuy nhiên, như bạn có thể tưởng tượng, mỗi máy phát có định dạng riêng và các trường nhập riêng của nó, và tôi muốn tạo một tệp .hbs mới cho mỗi và mỗi một tệp và sau đó chuyển tệp đó vào trang trình tạo để hiển thị bản xem trước.

Tôi đã giải quyết được 0,1% vấn đề với một phần. Trong tệp generator.hbs tôi đã nhập {{partial "generator-1"}} và điều này tải tệp _generator-3.hbs của tôi có chứa liên kết {{generatorFields.0.value}} và nó hoạt động. Nhưng phần đó không phải là năng động; Tôi cần phải tải một phần khác nhau mỗi lần tôi sử dụng một máy phát điện khác nhau. Làm thế nào tôi có thể đạt được điều này?

Làm cách nào để chuyển một phần động hoặc tải mẫu dựa trên dữ liệu mô hình mà tôi có?

Mã được sử dụng cho đến nay là dưới đây:

idex.hbs trông như thế này:

<table class="table table-hover"> 
      <thead> 
       <tr> 
        <th>#</th> 
        <th>Generator name</th> 
        <th>Action</th> 
       </tr> 
      </thead> 
      <tbody> 
       {{#each model}} 
       <tr> 
        <td>{{id}}</td> 
        <td>{{title}}</td> 
        <td>{{#linkTo 'generator' this classNames="btn btn-mini pull-right"}}Create file{{/linkTo}}</td> 
       </tr> 
       {{/each}} 
       </tbody> 
     </table> 

generator.hbs

{{#each generatorFields}} 
<div class="row-fluid"> 
    <div class="span4">{{name}}</div> 
    <div class="span8">{{view Ember.TextField valueBinding='value' class='span12' placeholder='Type value here…'}}</div> 
</div> 
{{/each}} 

{{partial "generator-1"}} 

_generator-1.hbs

<h1>Project: {{generatorFields.0.value}}</h1> 

app.js

App.Store = DS.Store.extend({ 
    revision: 13, 
    adapter: 'DS.FixtureAdapter' 
}); 

App.Router.map(function() { 
    this.resource('index', { path: '/' }); 
    this.resource('generator', {path: '/generator/:generator_id'}); 
}); 

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
     return App.Generator.find(); 
    } 
}); 

App.Generator = DS.Model.extend({ 
    title: DS.attr('string'), 
    templateName: DS.attr('string'), 
    generatorFields: DS.attr('generatorFields') 
}); 


// Fixture data 

DS.RESTAdapter.registerTransform('generatorFields', { 
    serialize: function(serialized) { 
     return Em.none(serialized) ? {} : serialized; 
    }, 
    deserialize: function(deserialized) { 
     return Em.none(deserialized) ? {} : deserialized; 
    } 
}); 

App.Generator.FIXTURES = [{ 
    id: 1, 
    title: "test 1", 
    generatorFields: [ 
     {id: 1, name: "name 1", value: ""} 
    ], 
    templateName: "generator-1" 
}, { 
    id: 2, 
    title: "test 2", 
    generatorFields: [ 
     {id: 1, name: "name 1", value: ""}, 
     {id: 2, name: "name 2", value: ""}, 
    ], 
    templateName: "generator-2" 
}]; 
+0

Bạn có thể tạo jsbin hoặc jsfiddle hiển thị sự cố không. – delwyn

Trả lời

14

Bạn có thể tạo một helper phần năng động mà sử dụng được thông qua vào tên để render với {{partial}} helper.

Ember.Handlebars.helper('dynPartial', function(name, options) { 
    return Ember.Handlebars.helpers.partial.apply(this, arguments); 
}); 

Sau đó, sử dụng phần động này {{dynPartial}} để thay thế.

{{#each item in controller}} 
    {{dynPartial item.templateName}} 
{{/each}} 

Cho máy phát điện có templateName của generator-1. Điều này sẽ hiển thị với một phần _generator-1. Lưu ý rằng tên của id/data-template-name của mẫu phải bắt đầu bằng dấu gạch dưới.

+0

Trong những khoảnh khắc như thế này, tôi nhận ra mình to lớn như thế nào, cảm ơn Darshan, bạn đã cứu cả ngày. – RaduM

+0

Bạn được chào đón. :) Tôi đã chỉnh sửa câu trả lời một chút để làm cho nó có thể mở rộng được. Tôi đã xảy ra với tôi rằng các đối số có thể được chuyển tiếp về phía trước như là. –

+0

Điều này có vẻ như nhiều việc hơn là cần thiết. Tôi không thể tìm ra cách khác để làm điều đó. –

5

Bạn có thể chỉ cần đặt biến một phần động của bạn trong bộ trợ giúp một phần.

{{#each item in controller}} 
    {{partial item.templateName}} 
{{/each}} 

Như @ darshan-sawardekar chỉ ra nếu bạn có một máy phát điện với templateName của generator-1 nó sẽ làm cho một phần _generator-1.

1

Trong khi câu trả lời của @ Darshan đơn giản hơn bên dưới và sẽ hoạt động trong nhiều trường hợp, tôi chỉ gặp sự cố khi chuyển sang cùng một tuyến đường với một mô hình khác gây ra phần không trả lại nếu tên của mô hình thứ hai cũng giống như của người đầu tiên (lỗi trong ember?). Thiết lập chế độ xem theo dõi mô hình sửa lỗi này.

App.FooDynamicLayout = Ember.View.extend 
    rerenderOnModelChange: (-> 
    @rerender() 
).observes('model') 

Và gọi nó với:

view App.FooDynamicLayout templateName=dynamicTemplateName model=model 
0

@KamrenZ đã đề cập này nhưng tôi figured tôi muốn trích dẫn chương và thơ đối với những người nhìn vào điều này. Nhiều phiên bản gần đây của Ember duyên dáng chấp nhận tên thuộc tính ràng buộc và sử dụng chúng trong các helper phần:

http://ember-doc.com/classes/Ember.Handlebars.helpers.html#method_partial

TÊN MẪU RÀNG BUỘC Tham số cung cấp cho một phần cũng có thể là một đường dẫn tới thuộc tính chứa một tên mẫu , ví dụ:

{{partial someTemplateName}} 

Ví dụ trên sẽ tìm kiếm các giá trị của someTemplateName trên ngữ cảnh mẫu (ví dụ: một bộ điều khiển) và sử dụng giá trị đó làm tên của mẫu để hiển thị. Nếu giá trị được giải quyết là sai, không có gì sẽ hiển thị . Nếu someTemplateName thay đổi, một phần sẽ là được hiển thị lại bằng tên mẫu mới.