最終更新: 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」の電子メールを使用してサインインする必要があります。次に、最初の回答をクリックすると、質問フォームを切り替える [質問を編集] リンクが表示されます。さて、そのフォームを開いた状態で質問を変更しても、フォームは引き続き使用可能であり、新しい質問がコンテンツとして表示されます。これは避けたい動作です。