2

最終更新: Kalman Hazinsが正しい方向を示してくれました。計算されたプロパティは、画面にレンダリングされていないために呼び出されていなかったため、再計算する必要はありませんでした。コントローラーの最終的なコードをここに含めます。

App.QuestionController = Ember.ObjectController.extend({
    isEditing : false,

    resetIsEditing : function() {
        this.set('isEditing', false);
    }.observes('model.id'),

    canEditQuestion : function() {
        return this.get('author.id') === App.currentUser;
    }.property('author.id')
}

更新:以下のレイモンド・リューによって「十分に良い」ソリューションが提供されています。「なぜこれが起こっているのか」という質問には実際には答えていませんが、これまでのところ最高です。


私は Ember.js を学んでおり、この本に従っていくつかの変更を加えています。私のコントローラにはモデルにバインドされたプロパティがありますが、そのようなモデルを変更してもプロパティは更新されません。

これはコントローラーです:

App.QuestionController = Ember.ObjectController.extend({
    isEditing : false,

    canEditQuestion : function() {
        this.set('isEditing', false);
        return this.get('author.id') === App.currentUser;
    }.property('model')
});

これはテンプレートです:

<script type="text/x-handlebars" id="question">
    {{#if isEditing}}
        <!-- edit question form -->
    {{else}}
        <p id="question">{{question}}</p>
        {{#if canEditQuestion}}
            <a href="#" {{action "toggleEditQuestion"}}>Edit question</a>
        {{/if}}
    {{/if}}
</script>

{{else}}期待どおりに機能する前にブランチのコンテンツを移動すると(ただし、希望どおりに移動しないことに注意してください{{#if isEditing}})。

questionおそらく、ネストされたルートであるという事実が重要です。

App.Router.map(function() {
    this.resource('questions', function() {
        this.resource('question', { path : '/:question_id' });
    });
});

私が欲しいのは、すでに質問を編集している場合でも、モデルを変更するとisEditingプロパティが元に戻りfalse、質問フォームが表示されないことです。常に質問をレンダリングすれば解決できるようですが、それは私が望んでいることではありません。私は何が欠けていますか?

question編集:とuserモデルのコードを追加しています:

App.Question = DS.Model.extend({
    title : DS.attr('string'),
    question : DS.attr('string'),
    date : DS.attr('date'),
    author : DS.belongsTo('user', { async : true }),
    answers : DS.hasMany('answer', { async : true }) 
});

App.User = DS.Model.extend({
    fullname : DS.attr('string'),
    email : DS.attr('string'),
    questions : DS.hasMany('question', { async : true })
});

App.currentUserプロパティはsign_inコントローラーで設定されます。

App.SignInController = Ember.Controller.extend({
    needs : [ 'application' ],

    actions : {
        signIn : function() {
            var email = this.get("email");
            var userToLogin = App.User.FIXTURES.findBy("email", email);

            if(userToLogin === void 0) {
                alert("Wrong email!");
                this.set("email", "");
            }
            else {
                localStorage.currentUser = userToLogin.id;
                App.set('currentUser', userToLogin.id);
            }
        }
    }
});

PS: 私のアプリの完全なコードは、https://github.com/goffreder/emberoverflowで入手できます。

PS2: アプリの機能するjsFiddleを取得することができました。再現するには、「tom@dale.com」の電子メールを使用してサインインする必要があります。次に、最初の回答をクリックすると、質問フォームを切り替える [質問を編集] リンクが表示されます。さて、そのフォームを開いた状態で質問を変更しても、フォームは引き続き使用可能であり、新しい質問がコンテンツとして表示されます。これは避けたい動作です。

4

4 に答える 4

2

更新:あなたの問題を誤解しました。別の質問に移動するときにフォームを無効にしたいですよね? question_routs.js ファイルに、これを追加します。

App.QuestionRoute = Ember.Route.extend({
  actions: {
    didTransition: function() {
      this.controller.set('isEditing', false);
      return true; // Bubble the didTransition event
    }
  }
})

これらのコードは、別の質問に移行するときに「isEditing」プロパティを false に設定します。isEiting プロパティが true に設定されている場合にのみ、別の質問に切り替えるときに canEditQuestion 関数/プロパティが呼び出されないことに気付きました。これはまさに解決する必要がある問題だと思います。そして、私には理由がわかりません。

于 2014-12-15T15:52:02.583 に答える
1

author.id計算されたプロパティは 2 つの変数に依存しているように見えますが、App.CurrentUserそれらは依存キーのリストにリストされていません。model代わりに、依存キーとしてのみリストしました。authorとの間の関係はわかりませんがmodel、プロパティを計算するために必要な実際のプロパティ/変数をリストする必要があります。

于 2014-12-15T15:08:16.837 に答える
0

次のようなことができます:

<script type="text/x-handlebars" id="question">
 {{#unless isEditing}}
    <p id="question">{{question}}</p>
    {{#if canEditQuestion}}
        <a href="#" {{action "toggleEditQuestion"}}>Edit question</a>
    {{/if}}
 {{else}}
    <!-- edit question form -->
 {{/unless}}
</script>
于 2014-12-15T04:48:22.220 に答える