2013-08-22 39 views
5

我希望能夠在Ember.Component js中定義組件模板的模型,而不是在組件所在的路徑中。我還沒有看到它正在做的任何的例子...定義在一堆不同路線中使用的Ember組件的模型?

這裏我有我的組件模板:

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

這裏是怎麼了把它放在一個路由模板中:

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

我想要做的是使用我的相關Ember.Component做一些東西與信息框的參數,然後返回一個模型。

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(); 
    } 
}); 

我希望能夠使用很多不同的路線裏面這個組件,我不希望有指路由特定信息箱是內部爲了給信息 - 它的模型,這是可能的,或者我應該使用一些其他功能,如常規模板和渲染助手?

+0

這不是從你的問題是如何dataDef明確將被用來獲得一個模型。你能澄清嗎? –

+0

@MikeGrassotti我的意思是,我認爲只要說我會獲得一個我希望用作模型的對象就足夠了。我不認爲我需要了解我正在使用的(非常獨特的)api的細節。我已經更新了我的問題,以包含模型可能的外觀示例。謝謝你的幫助! – sherlock

回答

1

一旦你的模型對象,組件本身上只設置屬性:

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

這個解決方案看起來非常令人興奮,但這種方法似乎並不適合我:http://jsbin.com/okiY/1/edit?html,js,output謝謝!這一個雖然:http://jsbin.com/okiY/2/edit?html,js,output真棒! – sherlock

+0

我現在愛你。 – sherlock

1

如果您想要定義要使用的模型(如果模型與當前上下文不同),則應該使用渲染。如果它是相同的上下文,你應該只使用partials。你也可以生成幫助器並將模型傳遞給它。

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') 
})); 

用法:

<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

很酷,謝謝,我要問我如何將參數(比如dataDef)放入一個渲染助手中,但我認爲你的例子表明了這一點。 – sherlock

相關問題