2014-06-12 44 views
2

我目前正在一個搜索欄上列出三種類型的對象:用戶,記錄和位置。每個人都有自己的模型,並定義了相應的控制器。我需要做的是檢查它是哪種類型的對象,因爲我需要與它呈現的HTML不同。如何檢查把手類型的對象?

{{#each mainUserSearchResults}} 
       {{#link-to 'user' this.userID}} 

       <div class="row mainListSeperator" {{action "getapplicantUserID" this target="view"}}> 
        <img class="applicantsIcon" src=""> 
        <div class="applicantsName"> 
        {{unbound this.firstName}}&nbsp;{{unbound this.lastName}} 
        </div> 
        <div class="applicantsTitle"> 
        User 
        </div> 
       </div> 

       {{/link-to}} 
      {{/each}} 

我遇到的唯一問題是,我需要它來打印this.firstName & this.lastName如果它是一個用戶,但我不能這樣做了記錄。對於記錄,我將不得不渲染另一個屬性 - this.recordID - 以與我做這個.firstName相同的方式。做到這一點的方式是if條件的,但我在HandleBars中找不到任何東西,這使我能夠檢查從mainUserSearchResults進入的數據是用戶還是記錄。

mainUserSearchResults是我的控制器中的一個屬性,它返回一個對象數組:當前它返回用戶對象和記錄對象的連接數組。

回答

0

Handlebars是一個無邏輯的模板,所以你真的不能執行計算,比如類型檢查。 There are some pretty good reasons for this。如果是我,我會推動這一責任的其他地方,可能是一路模型,原因有二:

  1. 你把DOM的任何條件等都很SLOW。當你使用慢速設備(最顯着的是移動設備)時,問題會變得更加複雜。
  2. 每當你添加一個新的可搜索的東西,你將不得不更新你的模板。而不是

    {{#if ...}} 
        ... 
    {{/if}} 
    
    {{#if ...}} 
        ... 
    {{/if}} 
    
    {{#if ...}} 
        ... 
    {{/if}} 
    
    {{#if ...}} 
        ... 
    {{/if}} 
    

代表:隨着時間的推移,你會結束。例如,在您的用戶模型中,添加

formattedName: (function() { 
    return [this.get('firstName'), this.get('lastName')].join(' '); 
}).property('firstName', 'lastName') 

對您的記錄和位置做同樣的操作。

然後,你的模板從

{{unbound this.firstName}}&nbsp;{{unbound this.lastName}} 

改變

{{unbound this.formattedName}} 

現在,如果你添加新類型的搜索,你有一個完全通用的解決方案,只需要模型來實現的formattedName財產。

有些人會說我的建議不好,因爲它將模型的業務邏輯責任與顯示邏輯混合在一起。在這種情況下,我猜你在多個地方顯示了{{firstName}} {{lastName}},所以我認爲讓代碼保持乾爽的好處勝過將它移到例如控制器。你的來電。

+0

非常感謝!我對混合業務和顯示邏輯猶豫不決,而且格式化後的名稱屬性需要多餘,但它似乎毫不費力地工作。至少現在,這對我來說是最有效的方式。 – Darshan

0

假設有一些方法來輕鬆2+對象類型的區分,可以使用if語句和渲染不同的模板(甚至使用不同的部分,http://emberjs.com/guides/templates/rendering-with-helpers/

<script type="text/x-handlebars" data-template-name="index"> 
    <ul> 
    {{#each item in model}} 
    <li> 

    {{#if item.foo}} 
     {{render 'foo' item}} 
    {{/if}} 

    {{#if item.cow}} 
     {{render 'cow' item}} 
    {{/if}} 
    </li> 

    {{/each}} 
    </ul> 
    </script> 


    <script type="text/x-handlebars" data-template-name="foo"> 
    I'm a foo: {{foo}} 
    </script> 

    <script type="text/x-handlebars" data-template-name="cow"> 
    I'm a cow: {{cow}} 
    </script> 

http://emberjs.jsbin.com/qinilege/1/edit

或者,如果你需要更先進的檢查,你可以使用一個項目控制器,並在那裏

{{#each item in model itemController='checker'}} 
    <li> 

    {{#if item.isFooBar}} 
    {{render 'foo' item.model}} 
    {{/if}} 

    {{#if item.isFooBaz}} 
    {{render 'fooz' item.model}} 
    {{/if}} 


    {{#if item.isCow}} 
    {{render 'cow' item.model}} 
    {{/if}} 
    </li> 
{{/each}} 


App.CheckerController = Em.ObjectController.extend({ 
    isFooBar: Ember.computed.equal('foo', 'bar'), 
    isCow: Ember.computed.notEmpty('cow'), 
    isFooBaz: Ember.computed.equal('foo', 'baz') 
}); 

0添加邏輯