Как передать объект / шаблон в качестве параметра в Javascript / jQuery - PullRequest
2 голосов
/ 28 июня 2010

Я пытаюсь сделать первый прорыв в jQuery. Я пытаюсь получить следующее, хотя я не уверен в терминологии, поэтому попытаюсь объяснить с помощью примера, использующего синтаксис C # / псевдокод

Скажем, я хочу (анонимный) объект в качестве параметра, который выглядит примерно так:

elemParameter {
    elemId,
    arg1,
    optionalArg2
}

и я хочу передать массив / коллекцию этих объектов в мою функцию

$(document).ready(function() {
    $.myFunction(
        new { Id = "div1", Color = "blue", Animal = "dog" },
        new { Id = "div3", Color = "green" },
        new { Id = "div4", Color = "orange", Animal = "horse" }
    );
}

и затем в моей функции мне нужно получить доступ к каждому объекту коллекции, что-то вроде:

(function($) {
    $.myFunction(var elemParams) {
        foreach (param in elemParams) {
            $('#' + param.Id).onclick = function() {
                this.css('background-color', param.Color);
                alert(param.Animal ?? 'no animal specified');
            }
        }
    }
}

Может кто-нибудь дать мне несколько указателей на правильный синтаксис для передачи параметров таким способом? Или предложите лучший способ достижения того же самого, если это не правильный путь в вещах в JavaScript.

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Ваш синтаксис немного сбит, он будет выглядеть примерно так:

$(function() {
  function myFunction() {
    $.each(arguments, function(i, arg) {
      $('#' + arg.Id).click(function() {
        $(this).css('background-color', arg.Color);
        alert(arg.Animal || 'no animal specified');
      });
    });
  }
  myFunction({ Id: "div1", Color: "blue", Animal: "dog" },
             { Id: "div3", Color: "green" },
             { Id: "div4", Color: "orange", Animal: "horse" });​
});

Вы можете попробовать демо здесь , стиль синтаксиса называется Буквальная нотация JavaScript-объекта , это то, что вы ищете, ища больше информации об этом :) *

В качестве альтернативы вы можете передать объекты в виде массива, если вам нужно другие аргументы в дополнение к ним, вместо непосредственного использования arguments.

1 голос
/ 28 июня 2010

Вы ищете "буквенное обозначение объекта".Это выглядит так:

{
    propertyName: propertyValue,
    propertyName2: propertyValue2
}

Вы не используете ключевое слово new с ними, это просто буквальная конструкция, такая как строки ("foo") или числа (42).Аналогично, у вас есть литералы массива:

["one", "two", "three"]

Вот ваш обновленный пример:

$(document).ready(function() {
    $.myFunction(
        // <== Start an array literal with [
        [
            // <== Colons rather than equal signs
            { Id: "div1", Color: "blue", Animal: "dog" },
            { Id: "div3", Color: "green" },
            { Id: "div4", Color: "orange", Animal: "horse" }
        // End the array literal with ]
        ]
    );
}

Обратите внимание, что важно не иметь запятой в конце литерала объекта или массива, например

["one", "two", "three", ]
                      ^--- Don't do that
{foo: "bar", x: 27, }
                  ^------- Or that

Вопрос о том, были ли они действительными, был неясен (теперь это ясно по состоянию на последнее 5-е издание), и IE (по крайней мере) задыхается от них., но обычно имена свойств в коде JavaScript находятся в camelCase и начинаются со строчной буквы (например, animal, а не Animal).Однако это чисто стиль.

...