2015-02-24 61 views
0

我有一个博客文章中的下载列表。点击链接后,我正在递增下载downloadcount属性。为了防止进一步执行,我有这个项目控制器download。由于某些原因,alreadyIncreased即使在连续执行操作时也始终为false。 这是为什么?防止进一步的动作执行

import Ember from 'ember'; 

export default Ember.ObjectController.extend({ 

    alreadyIncreased: false, 

    actions: { 
    incDownload: function() { 

     if (this.get('alreadyIncreased') === false){ 
     this.set('alreadyIncreased', true) 

     this.get('model').incrementProperty('downloadcount') 
     this.get('model').save() 
     } 
    } 
    } 
}) 

这是模板:

{{#each download in post.downloads itemController="base.download" }} 
    <p> 
     <a {{ action "incDownload" }}> 
     {{ download.name }} 
     </a> - {{ download.downloadcount }} Hits 
    </p> 
    {{/each}} 

回答

1

我的猜测是,在你的#each循环的项目被重新渲染(出于某种原因)和项目控制器被重新创建。有一个相当简单的方法来测试那些,只是添加到您的项目控制器类:

wasCreated: function() { 
    console.log('Item controller created'); 
}.on('init') 

这将运行每次您的项目控制器被实例化时。有了这个,尝试点击其中一个下载链接,看看它是否在后面运行。如果是这样,那么你的问题就是我上面所描述的。由于这个原因,我个人从来没有在项目控制器中放置持久状态。我通常允许这个行为冒泡到父控制器,并把状态放在那里。或者我会将模型包装在一个包装对象中,并将状态置于那里。

+1

我猜这正是发生了什么事。我认为当itemController下面的模型改变时,itemController会被重新生成。 – 2015-02-24 15:10:01

+0

你是对的。我现在处理父控制器中的对象,这将不会被重新生成。 – Hedge 2015-02-24 15:14:01