最终更新: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')
}
更新:Raymond Liu下面提供了一个“足够好”的解决方案,它并没有真正回答“为什么会这样”的问题,但它是迄今为止我所拥有的最好的。
我正在学习 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”电子邮件登录。然后,如果您单击第一个答案,您应该会看到一个切换问题表单的“编辑问题”链接。现在,打开该表单,如果您更改问题,该表单仍然可用,新问题作为内容,这是我想要避免的行为。