2013-01-04 130 views
2

我最近在看Emberjs,发现这由它的主要贡献者之一写有用的文章:Advice on & Instruction in the Use Of Ember.js如何正确清除Ember.Enumerable的内容?

它走到我通过从服务器获取用户数据的列表和使它们在屏幕上的例子。我会简单介绍一下它的工作原理:

  1. 该应用程序与服务器联系以获取虽然AJAX调用 用户数据的列表。
  2. 在ajax调用结束时,立即返回一个空的枚举值 ,稍后将其用作控制器的属性。
  3. ajax调用完成后,它会使用数据填充枚举,其中 轮流更新控制器的属性,最后触发 自动重新呈现。

只要列表没有被重新访问,这工作正常。当用户重新访问列表时,假设他/她导航到另一个状态然后返回,逻辑将再次触发,从服务器获取数据并填充列表。但是,这次的清单并不是空的!因此我们有一个重复数据的列表。我想通过在ajax调用成功时清除列表的内容来解决这个问题。以下是ajax调用的代码:

allAwesomebergs: [], 
fetch: function(){ 
    $.ajax({ 
     url: 'https://api.github.com/repos/emberjs/ember.js/contributors', 
     dataType: 'jsonp', 
     context: this, 
     success: function(response) { 
      response.data.forEach(function(awesomeberg){ 
       this.allAwesomebergs.addObject(App.Awesomeberg.create(awesomeberg)) 
      }, this); 
     } 
    }); 
    return this.allAwesomebergs; 
}, 

上面的代码不会清除列表中的内容。我试图在成功函数的开头添加一行“allAwesomebergs = []”,但我得到的只是一个空白屏幕。我想我可能没有正确地做到这一点,但我看着Ember的文档,并没有看到有关清除Enumerable内容的任何内容。

因此,问题是:什么是解决这个重复加载问题的最简单方法?清理手中的内容似乎是最明显的,但我无法使其工作。

回答

2

在开始添加新对象之前,您可以拨打clear()。见this documentation

新代码将是:

allAwesomebergs: [], 
fetch: function(){ 
    $.ajax({ 
     url: 'https://api.github.com/repos/emberjs/ember.js/contributors', 
     dataType: 'jsonp', 
     context: this, 
     success: function(response) { 
      this.allAwesomebergs.clear(); 
      response.data.forEach(function(awesomeberg){ 
       this.allAwesomebergs.addObject(App.Awesomeberg.create(awesomeberg)) 
      }, this); 
     } 
    }); 
    return this.allAwesomebergs; 
}, 
+0

我认为这不会工作,因为allAwesomebergs是一个普通的iavascript数组。 – mavilein

+1

我相信烬自动将它的一些附加功能应用到Array类。 – CraigTeegarden

+1

谢谢你的支持!默认情况下,@mavilein是可选的,它将原生javascript对象封装到它们的ember版本中。通过一切手段,我尝试了这一点,它的工作。只要我与我曾经使用过的同一个数组一起工作,并清除那个相同的数组不会弄乱绑定。 –

-2

我觉得你的做法是好的,但它应该是:

this.allAwesomebergs = [] 

这是所有在它前面的这个。所以这里不需要清楚。

+1

我相信这会创建一个新的javascript数组,这会破坏ember.js绑定。看到这个问题:http://stackoverflow.com/questions/1232040/how-to-empty-an-array-in-javascript – CraigTeegarden

+0

感谢您的回答,但作为@ c4p指出,这将无法正常工作。我给出的代码片段是在ajax调用中,我已经将上下文设置为“this”,这意味着“this”指针在这种情况下没有任何区别。 –