2017-02-04 7 views
0

Emberを初めて使用し、Ember.js 2.10を使用しています。私はコントローラの代わりにコンポーネントを使用しようとしています。私は、リンクまたは単なるアイテムのリストで、ソートされているか、送られたプロパティに基づいてソートされていないリストを作成するコンポーネントを作成しようとしています。リンク部分は動作していますが、私は何か間違っていると思うように多くのコードを繰り返さずに作業を並べ替えます。私は、ソートロジックを計算されたプロパティに移動しようとしましたが、動作しません。 sortByプロパティを指定しない場合でも、リストはソートされます。 sortByプロパティを指定すると、リストが表示されず、console.logにComputedPropertyとして返される内容が表示されます。ember.jsコンポーネントのソートモデルがifプロパティに基づいて設定されています

これは基本的なことではありません。私はこれを行う必要はありません。もしEmberのやり方があれば、私は知りたいと思います。それにもかかわらず、私はそれの学問的価値のために間違っていることを理解したいと思います。

app/components/column-list.js

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    tagName: 'ul', 
    classNames: ['column-list'], 
    sortedItems: Ember.computed('items', 'sortBy', function() { 
    if (this.get('sortBy') !== undefined) { 
     let sd = [ this.get('sortBy') ]; 
     return Ember.computed.sort(this.get('items'), sd); 
    } else { 
     return this.get('items'); 
    } 
    }), 
}); 

app/templates/components/column-list.hbs

{{#if sortBy}} 
    {{#each sortedItems as |item|}} 
    <li> 
     {{#if link}} 
     {{#link-to link item.id}} 
      {{yield item}} 
     {{/link-to}} 
     {{else}} 
     {{yield item}} 
     {{/if}} 
    </li> 
    {{/each}} 
{{else}} 
    {{#each items as |item|}} 
    <li> 
     {{#if link}} 
     {{#link-to link item.id}} 
      {{yield item}} 
     {{/link-to}} 
     {{else}} 
     {{yield item}} 
     {{/if}} 
    </li> 
    {{/each}} 
{{/if}} 

app/templates/category/index.hbs

{{#column-list class="categories" sortBy="title" link="category.show" items=model as |i|}} 
    {{i.title}} 
{{/column-list}} 

mirage/fixtures/category.js

export default [ 
    { 
    id: 'main-dishes', 
    title: 'Main Dishes', 
    }, { 
    id: 'cakes-pies-and-sweets', 
    title: 'Cakes, Pies & Sweets', 
    }, { 
    id: 'langappie', 
    title: 'Langappie', 
    }, { 
    id: 'dips-and-sauces', 
    title: 'Dips & Sauces', 
    }, { 
    id: 'meat-dishes', 
    title: 'Meat Dishes', 
    }, { 
    id: 'vegetable', 
    title: 'Vegetable', 
    }, { 
    id: 'seafood-dishes', 
    title: 'Seafood Dishes', 
    }, { 
    id: 'bread-and-cereals', 
    title: 'Bread & Cereals', 
    } 
]; 

更新:ので、私は思う:

私は@Jovicaが作ったと私は「関数や文字列の配列でなければならないの 『sortedItems』のソート定義アサーションに失敗しました」を取得していますという責めをtwiddledまだ何かが間違っています。 Link to twiddle

アップデート2:

私は私の責めにタイプミスを持っていたし、それが正常に動作してしまったことがわかりました。 new twiddleには正しい修正があります。今私は尋ねることなくエバーミラージュがデータを注文する理由を理解することができますが、それは別の問題です。

+0

ようこそStackoverflow!長いコードを貼り付ける代わりに[twiddle](https://ember-twiddle.com/)と書くことをお勧めします。こうすることで、多くの回答者があなたのコードで遊ぶことができます。 – ykaragol

+0

コントローラについては、次のドキュメントをお読みください。http://emberjs.com/learn/#faq-future-proof https://guides.emberjs.com/v2.11.0/controllers/#toc_common-questions – locks

+0

@ロック私はいくつかの変更を残してコントローラが残っていることを理解します。このコードは、アプリケーションで何度も再利用できるため、コンポーネントの最適な候補のようでした。あなたは同意しますか?私はちょうど私があなたのコメントを理解していることを確認したい。 –

答えて

1

Ember.computed.sortマクロを返すこの

sortedItems: Ember.computed('items', 'sortBy', function() { 
    if (this.get('sortBy') !== undefined) { 
    let sd = this.get('sortBy'); 
    return this.get('items').sortBy(sd); 
    } else { 
    return this.get('items'); 
    } 
}), 

たり短くしてみてください、あなたはそれが何を考えてやっていません。 Arrayクラスのsortメソッドを使用する必要があります。依存キーも正しく宣言されていないため、リストを更新する場合はitems.[]になります。

ここでコンポーネントの変更に渡されたソートするたびにソート・キーを更新提案ソリューションです:sortByは空の配列であるとき、計算されたマクロがないので

export default Ember.Component.extend({ 
    appName: 'Ember Twiddle', 
    dishes: foo, 
    sortedItems: Ember.computed.sort('dishes', 'sortBy') 

    didReceiveAttrs() { 
    if (this.get('sortBy')) { 
     this.set('sortBy', [ this.get('sortBy') ]); 
    else { 
     this.set('sortBy', []); 
    } 
    } 
}); 

そして、ここではあなたが必要とするテンプレートは、です配列を並べ替える:

{{#each sortedItems as |item|}} 
    <li> 
    {{#if link}} 
     {{#link-to link item.id}} 
     {{yield item}} 
     {{/link-to}} 
    {{else}} 
     {{yield item}} 
    {{/if}} 
    </li> 
{{/each}} 
+0

あなたのソリューションととの違いを理解するだけです。@ Jovicaは、ページをリロードしなくても新しいsortByを渡した場合、このコードがリストを利用するということです行動)?新しいリストアイテムがEmber Dataに非同期に追加された場合(Webソケットまたは何か)、名前が変更されたアイテムの場合、リストは自動的に更新され、ソートされません(私はEmberがデータは変更されますが、私はそれをどうやって行うのか分かりません)? –

0

バージョン

sortedItems: Ember.computed('items', 'sortBy', function() { 
    let sortTerm = this.get('sortBy'), 
     items = this.get('items'); 
    return Ember.isBlank(sortTerm) ? items : items.sortBy(sortTerm); 
} 
+0

私はこの[twiddle](https://ember-twiddle.com/1f66e42b3b9e906ae395885474e3483d?openFiles=templates.application.hbs%2Ctemplates.components.column-list.hbs)で動作させますが、この 'sortBy'メソッドを忘れました[Ember.Array'](http://emberjs.com/api/classes/Ember.Array.html#method_sortBy)..しかし、私は 'return Ember.computed.sort' pattenを返すのかどうか分かりません。これは決してうまくいかず、私たちは決してそれをしてはいけません。私の前提は正しいのですか? – kumkanillam

+0

@kumkanillam私はそれが使用できるとは思うが、sortByメソッドがこの例ではもっと適しているので、必要はないと思う。 –

+0

ありがとうございます。あなたの短いバージョンでは、結果を返す – kumkanillam

関連する問題