jQuery DOM对象和通过引用传递

时间:2012-01-12 21:17:42

标签: javascript jquery

首先让我先说一下这个问题,说我对Javascript很新。

我也理解Javascript对象是通过引用传递的,而原语是通过值[source]传递的。

那就是说,这是我的问题(简化示例):我正在提取包含大量不同信息的JSON数据,我需要将每种不同类型的信息放入另一个<ul><ul> 1}}像这样:

<ul class="car-tree">
  <li>
    <label>Sports Cars</label>
    <ul class="sport-cars">
      <li>Porsche</li>
      <li>Mercedes</li>
      <li>BMW</li>
    </ul>
  </li>
  <li>
    <label>Super Cars</label>
    <ul class="super-cars">
      <li>Ferrari</li>
      <li>Lamborghini</li>
    </ul>
  </li>
  <li>
    <!-- and so on... -->
  </li>
</ul>

我正在抓取上面列表中的模板,其中包含除最内部<li>标记之外的所有内容,我正试图像这样填充它:

var CarView = function(){

  var buildCarTree = function(){

    // Gets the JSON data from somewhere
    var jsonData = grabJsonData();

    // Grab the template and convert it into a jQuery object
    var template = $(grabCarTreeTemplate());

    // Adds sport car data to sports cars list
    this.addCars(template.find('.sports-cars'), jsonData.sportsCars);

    // Adds super car data to sports cars list
    this.addCars(template.find('.super-cars'), jsonData.superCars);

    // Add the car tree to some container
    $('#container-trees').append(template);
  }

  var addCars = function(container, carData){

    for(id in carData){
      $('<li/>', {
        text : carData[id].text
      }).appendTo(container);
    }
  }
};

var view = new CarView();
view.buildCarTree();

执行此操作时,您会获得没有添加数据的模板,但是,如果您在console.log中添加addCars语句,则可以看到添加到container的数据}参数。

我很困惑,因为根据我从上面提供的资料中理解的内容:

  

...如果您更改参数本身......这不会影响该项目   被送入参数的。但是如果你改变了内部   参数,将传播回来......

我想我会appendTo改变jQuery对象的内部结构。这是什么交易?

1 个答案:

答案 0 :(得分:1)

看起来你正试图调用私有var函数,就好像它们是obj的方法一样。更改为此并尝试:

var CarView = function(){

  this.buildCarTree = function(){

    // Gets the JSON data from somewhere
    var jsonData = grabJsonData();

    // Grab the template and convert it into a jQuery object
    var template = $(grabCarTreeTemplate());

    // Adds sport car data to sports cars list
    this.addCars(template.find('.sports-cars'), jsonData.sportsCars);

    // Adds super car data to sports cars list
    this.addCars(template.find('.super-cars'), jsonData.superCars);

    // Add the car tree to some container
    $('#container-trees').append(template);
  }

  this.addCars = function(container, carData){

    for(id in carData){
      $('<li/>', {
        text : carData[id].text
      }).appendTo(container);
    }
  }
};

var view = new CarView();
view.buildCarTree();

编辑:有关正常工作的代码,请参阅此jsFiddle:http://jsfiddle.net/eHrH6/