2013-08-22 25 views
5

Tôi muốn có thể xác định mô hình cho một mẫu thành phần bên trong phần tử Ember.Component thay vì bên trong tuyến đường nơi thành phần đang ngồi. Tôi chưa thấy bất kỳ ví dụ đó đang làm điều này ...Xác định mô hình cho thành phần Ember được sử dụng trong một loạt các tuyến đường khác nhau?

Ở đây tôi có mẫu thành phần của tôi:

<script type="text/x-handlebars" id="components/info-box"> 
    <div class="infoBox box"> 
     <p> 
      <label> 
       {{preUnits}} 
      </label> 
      <span> 
       {{value}} 
      </span> 
     </p> 
    </div> 
</script> 

Và đây là cách tôi đang đặt nó bên trong một tuyến đường mẫu:

{{info-box title='Total Area' dataDef='buddhaData:DataGet/site/areaNum'}} 

Những gì tôi muốn làm là sử dụng Ember.Component liên quan của tôi để làm một số công cụ với các thông số của hộp thông tin và sau đó trả về một mô hình cho nó.

App.InfoBoxComponent = Ember.Component.extend({ 
    buildIt: function(){ 
     var container = $('#' + this.get('elementId')); 
     var title = this.get('title'); 
     var preUnits = this.get('preUnits') || ''; 
     var dataDef = this.get('dataDef'); 

     // Do stuff with dataDef. 

     var model = { 
      preUnits: '$', 
      value: 5000 
     } 

     // Hopefully return model somehow. 

    }, 

    didInsertElement: function(){ 
     this.buildIt(); 
    } 
}); 

Tôi muốn để có thể sử dụng thành phần này bên trong một loạt các tuyến đường khác nhau, và tôi không muốn phải tham khảo các tuyến đường mà một thông tin-box đặc biệt là bên trong để cung cấp cho các thông tin -box mô hình của nó, là điều này có thể, hoặc tôi nên sử dụng một số tính năng khác, như một mẫu thường xuyên và trợ giúp hiển thị?

+0

Nó không rõ ràng từ câu hỏi của bạn như thế nào dataDef sẽ được sử dụng để có được một mô hình. Bạn có thể làm rõ? –

+0

@MikeGrassotti Ý tôi là, tôi nghĩ rằng nó đủ để nói rằng tôi sẽ có được một đối tượng, mà tôi muốn sử dụng làm mô hình của tôi. Tôi không nghĩ rằng tôi cần phải nhận được vào các chi tiết của api (khá độc đáo) tôi đang sử dụng. Tôi đã cập nhật câu hỏi của mình để bao gồm ví dụ về mô hình có thể trông như thế nào. Cảm ơn bạn đã giúp đỡ! – sherlock

Trả lời

1

Một khi bạn có đối tượng mô hình, chỉ cần thiết lập các thuộc tính trên phần bản thân:

App.InfoBoxComponent = Ember.Component.extend({ 
    buildIt: function(){ 
    var container = $('#' + this.get('elementId')); 
    var title = this.get('title'); 
    var preUnits = this.get('preUnits') || ''; 
    var dataDef = this.get('dataDef'); 

    // Do stuff with dataDef. 

    var model = { 
     preUnits: '$', 
     value: 5000 
    } 

    // Set component's preUnits and value properties directly 
    this.setProperty('preUnits', model.preUnits); 
    this.setProperty('value', model.value); 

    // or 
    this.setProperties(model); 


    // Hopefully return model somehow. 

    }, 

    didInsertElement: function(){ 
    this.buildIt(); 
    } 
}); 
+0

Giải pháp này có vẻ rất thú vị, nhưng phương pháp này dường như không hiệu quả đối với tôi: http://jsbin.com/okiY/1/edit?html,js,output thanks! Điều này mặc dù: http://jsbin.com/okiY/2/edit?html,js,output AWESOME! – sherlock

+0

Tôi yêu bạn ngay bây giờ. – sherlock

1

Bạn nên sử dụng kết xuất nếu bạn muốn xác định mô hình nào bạn muốn sử dụng (nếu mô hình khác với ngữ cảnh hiện tại). Nếu đó là bối cảnh tương tự, bạn chỉ nên sử dụng partials. Bạn cũng có thể tạo ra helper và truyền vào mô hình đó.

Ember.Handlebars.helper('autocomplete', Ember.View.extend({ 
    templateName: 'controls/autocomplete', 

    filteredList: function() { 
    var list = this.get('list'), 
     filter = this.get('filter'); 

    if (!filter) { return list; } 

    return list.filter(function(item) { 
     return item.name.indexOf(filter) !== -1; 
    }); 
    }.property('list.[]', 'filter') 
})); 

Cách sử dụng:

<script type="text/x-handlebars" data-template-name="application"> 
    {{autocomplete list=list1}} 
    {{autocomplete list=list2}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="controls/autocomplete"> 
    <p>{{input type="text" value=view.filter}}</p> 
    <ul> 
    {{#each view.filteredList}} 
     <li >{{name}}</li> 
    {{/each}} 
    </ul> 
    </script> 

Full example

+0

Tuyệt vời, cảm ơn, tôi sẽ hỏi làm thế nào tôi có thể phù hợp với các tham số (chẳng hạn như dataDef) vào một trình trợ giúp hiển thị, nhưng tôi nghĩ rằng ví dụ của bạn cho thấy điều đó. – sherlock

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