Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ember.js不更新模型_Javascript_Ember.js_Ember Model - Fatal编程技术网

Javascript Ember.js不更新模型

Javascript Ember.js不更新模型,javascript,ember.js,ember-model,Javascript,Ember.js,Ember Model,最终更新:为我指明了正确的方向,计算属性没有被调用,因为它没有呈现在屏幕上,所以没有“必要”重新计算它。这里我将包括控制器的最终代码: App.QuestionController = Ember.ObjectController.extend({ isEditing : false, resetIsEditing : function() { this.set('isEditing', false); }.observes('model.id'),

最终更新:为我指明了正确的方向,计算属性没有被调用,因为它没有呈现在屏幕上,所以没有“必要”重新计算它。这里我将包括控制器的最终代码:

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')
}
App.QuestionController = Ember.ObjectController.extend({
    isEditing : false,

    canEditQuestion : function() {
        this.set('isEditing', false);
        return this.get('author.id') === App.currentUser;
    }.property('model')
});
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);
            }
        }
    }
});

更新:下面提供了一个“足够好”的解决方案 ,它并没有真正回答“为什么会发生这种情况”的问题,但这是我迄今为止所掌握的最好的答案


我正在学习Ember.js,跟随这本书并做一些修改。在我的控制器中,我有一个绑定到模型的属性,但当我更改此类模型时,该属性不会更新

这是控制器:

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')
}
App.QuestionController = Ember.ObjectController.extend({
    isEditing : false,

    canEditQuestion : function() {
        this.set('isEditing', false);
        return this.get('author.id') === App.currentUser;
    }.property('model')
});
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);
            }
        }
    }
});
这是模板:

<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>
我想要的是,即使我已经在编辑一个问题,如果我更改了模型,
isEditing
属性应该返回到
false
,并且问题表单不会显示。显然,如果我总是提出问题,我可以解决它,但那不是我想要的。我错过了什么

编辑:我正在为
问题
用户
模型添加代码:

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
属性在
登录
控制器中设置:

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')
}
App.QuestionController = Ember.ObjectController.extend({
    isEditing : false,

    canEditQuestion : function() {
        this.set('isEditing', false);
        return this.get('author.id') === App.currentUser;
    }.property('model')
});
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:我的应用程序的完整代码可在


PS2:我设法让我的应用程序正常运行。要复制,您必须使用登录'tom@dale.com“电子邮件。然后,如果单击第一个答案,您将看到一个“编辑问题”链接,用于切换问题表单。现在,打开该表单后,如果您更改问题,表单仍将可用,新问题作为内容,这是我希望避免的行为。

您可以执行以下操作:

<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>

{{{#除非是编辑}

{{question}

{{{#如果是问题} {{/if} {{else} {{/除非}
您的计算属性似乎取决于两个变量,
author.id
App.CurrentUser
,这两个变量未列在从属键列表中。相反,您只将
model
列为从属键。我不知道
作者
模型
之间的关系是什么,但你应该列出你计算属性所需的实际属性/变量。

更新:我误解了你的问题。你想在进入另一个问题时禁用表单,对吗?在您的问题_routs.js文件中,添加以下内容:

App.QuestionRoute = Ember.Route.extend({
  actions: {
    didTransition: function() {
      this.controller.set('isEditing', false);
      return true; // Bubble the didTransition event
    }
  }
})
当您转换到另一个问题时,这些代码将“IsEdit”属性设置为false。
我注意到当切换到另一个问题时不会调用canEditQuestion函数/属性,只是如果isEiting属性设置为true,我认为这正是需要解决的问题。我也不知道为什么。

@Goffreder和@Raymond Liu,
canEditQuestion
函数/属性未触发的原因如下

在Ember.js中,(计算的)属性评估是“神奇的”,但我们都知道,“神奇”可能会很昂贵。因此,计算属性的值会被缓存,这样“魔法”就不必一直发生,除非有什么变化,否则缓存的值不会被重新计算。不仅如此,如果属性没有显示在屏幕上,为什么还要麻烦重新计算它呢?请参阅jsbin以了解我所说的内容。请注意,
lazyprodep
是如何从不更新的,因为屏幕上从未显示
lazyDep
属性

现在,回到你的例子<代码>canEditQuestion属性在编辑问题时不会呈现在屏幕上(因为它位于else块中)。因此,将
isEditing
重置为false的
canEditQuestion
函数永远不会被调用

我认为您需要的是将重置逻辑放入,同时将其他逻辑保留在属性中,如下所示:

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

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

这样,每次新模型(具有新模型id)加载到控制器中时(即使以前的模型处于编辑模式),观察者代码都会触发将
i编辑
属性重置为
false

,这似乎无法解决我的问题,它只是切换truthy和falsy分支。您尝试过吗?在把手中,最好将嵌套
if
条件放在
if
块中,而不是
else
块中。如果您不想使用
,除非
,则必须将
I编辑
更改为
true
。我已经尝试过了,它的行为方式与我的原始代码相同。既然我对Ember和Handlebar都是新手,为什么使用嵌套
if
比使用
else
块更好?您不想
author.get('id')
?除了回答中提出的关于正确编写依赖项的其他要点之外。请记住,
.property('model')
并不意味着模型中的某些内容发生了更改,而是意味着模型本身——模型对象——变成了另一个模型对象。编辑:对不起,目标错误^ ^为什么我要
author.get('id')
?这是访问属性的更好方式吗?我知道computed属性依赖于整个模型是不同的,而不是它的单个属性,只是如果我不直接用它的模板渲染它,模型似乎不会改变。也许应该是这样的,我不知道(这就是为什么我要求^ ^)完全同意@torazaburo的观点,一定要正确指定依赖项。而且,您的模板逻辑没有意义。如果
canEditQuestion
为真,则需要检查
isEditing
,而不是相反。此外,您不希望触发计算属性中的属性更改。观察者会这样做,并且属性只能用于计算有问题的属性。最后,computed属性只有在被访问时才被计算,因此将其嵌套在以false开头的模板条件中意味着它永远不会被该属性更新。@AdamRobertson:什么意思