Javascript范围的类属性

时间:2014-08-14 18:31:12

标签: javascript ajax class scope

所以,我有这个代码(剥离)

var Categories;
Categories = {url:'someurl', list : [] };
Categories.CreateCategory = function ()
{
  // do some checks
  // gather some data

$.ajax( {/*ajax options here, expecting JSON format*/} )
.done(function ( data )
  {
      var ctg = new Category();
      ctg.Id = data.id;
      Categories.list[ctg.id] = ctg;
  } )
}

但是,新类别不会附加到列表中。

我试过

  • 将ajax调用的上下文更改为类别
  • 列出类别变量(var s=Categories; ...; s.list[ctg.Id] = ctg; Categories = s; )
  • 创建一个将新类别附加到列表
  • 的新方法

这些都不起作用。

更多信息

CreateCategory方法旨在用于网站的管理面板,这就是我需要在单独的脚本中扩展Categories类的原因。

以前的版本包含整个版本的Categories类,其中一堆代码与用户版本相同,就像魅力一样。


解决

事实证明我的代码中有一个拼写错误。

  Categories.list[ctg.id] = ctg;

应该是

  Categories.list[**ctg.Id**] = ctg;

3 个答案:

答案 0 :(得分:3)

有一个拼写错误:

Categories.list[ctg.id] = ctg;

ctg.id应为ctg.Id

答案 1 :(得分:1)

也会失败,如果您发现错误,则可以使用.push来更新.length属性

var Categories;
Categories = {url:'someurl', list : [] };
Categories.CreateCategory = function ()
{
  // do some checks
  // gather some data

  $.ajax( {/*ajax options here, expecting JSON format*/} )
  .done(function ( data )
  {
      var ctg = new Category();
      ctg.Id = data.id;
      Categories.list.push(ctg);
   } )
   .fail(function(){
     console.log("error on get category");
     console.log(arguments);
   })
}

答案 2 :(得分:0)

此处的问题似乎是Categories.list是一个数组,但您通过Categories.list[ctg.id]分配了一个属性。 @tpb正确地指出你在那里有一个拼写错误,这可能是你问题的根源,但是这是否会按预期工作将取决于id属性的值。你几乎肯定想要:

  • 使用.push()将新值添加到数组中,或
  • 使用对象而不是list的数组。

测试:

var a = [];
a["foo"] = 1; // a now has a property called "foo", but it's not an array member
a; // []
a[10] = 2; // a has 2 at pos 10, which sticks in 10 undefined values
a; // [undefined x 10, 2]

因此,如果您确切知道id值集合都是数字且密集连续,那么这只是一个好主意。