1

Ember.jsCRUD RESTful API から取得したネストされたコメントのリストを表示するアプリを作成しています。

途中で、私はおそらくEmber.jsそのパラダイムを悪用し、利用していないことに気づきました。

たとえば、私のCommentオブジェクトは次のようになります。

App.Comment = Em.Object.extend({
  id: null,
  author: null,
  text: null,

  delete: function() { /* AJAX call to API here */ }
});

delete()コントローラではなく、モデル オブジェクトの一部として関数を使用しても問題ありませんか?

私が持っているもう 1 つの疑問は、状態の扱いです。私のテンプレートでは、次のようにします。

{{#if view.comment.editing}}
    {{view Ember.TextArea valueBinding="view.comment.text"}}
    <a href="#" {{action cancelEditingComment}}>Cancel</a>
{{else}}
    <p>{{view.comment.text}}</p>
    <a href="#" {{action editComment}}>Edit</a>
{{/if}}

次に、私のルーターでは、editCommentおよびcancelEditingCommentアクションが に委任されCommentます。これには機能があります。

startEditing: function() { this.set('editing', true); }
cancelEditing: function() { this.set('editing', false); }

この種のコードは機能しているように見えますが、何か間違ったことをしていると思わずにはいられません。

私のコードを再編成する方法について何か提案はありますか?

4

1 に答える 1

2

私の経験から、モデルには実際にはビジネスロジックが含まれていてはなりません。生成可能な複雑なフィールドがある場合は、フィールドのセットと、計算されたプロパティが含まれている必要があります。

コントローラに委任するビューは、削除するための正しい動きです。ただし、編集に関しては、これを気にするのは実際にはあなたのビューだけであるため(通常)、isEditingビュー自体の一部を作成する傾向があります。次に、このフラグをチェックして、入力用に単純なテキストを描画するか、テキスト領域を描画するかを決定できます。

App.controller = Em.Object.create({
    comments: [],

    deleteComment: function(comment) {
        this.get('comments').removeObject(comment);
    }
});

App.CommentView = Em.View.extend({
    comment: null,
    isEditing: null,

    delete: function() {
        App.controller.deleteComment(this.get('comment'));
    },

    startEditing: function() {
        this.set('isEditing', true);
    }
});
于 2012-12-05T10:51:07.247 に答える