Действительно ли возможно прислушаться к изменениям в атрибутах объекта в JavaScript?

Похоже, вы уже проделали большую часть тяжелой работы с полярной системой координат. Имейте в виду, однако, что углы указаны в радианах, а не в градусах, поэтому вместо использования 360 следует использовать PI * 2. Теперь все, что вам нужно сделать, это одновременно увеличить distance и theta, чтобы создать спираль, а phi остается близким к 0, чтобы создать плоскость эклиптики галактики.

  • distance будет расти с 0 до galaxySize
  • theta будет расти с 0 до Math.PI (или PI * 2, если вы хотите более плотные спирали)
  • phi остается близким к 0
// Temp variables to assign new values inside loop
var norm, theta, phi, thetaVar, distance;

// Generate particles for spiral galaxy:
for (let i = 0; i < 1000; i++) {
    // Norm increments from 0 to 1
    norm = i / 1000;

    // Random variation to theta [-0.5, 0.5]
    thetaVar = THREE.Math.randFloatSpread(0.5);

    // Theta grows from 0 to Math.PI (+ random variation)
    theta = norm * Math.PI + thetaVar;

    // Phi stays close to 0 to create galaxy ecliptic plane
    phi = THREE.Math.randFloatSpread(0.1);

    // Distance grows from 0 to galaxySize
    distance = norm * galaxySize;

    // Here I need generate spiral arms instead of sphere.
    geometry.vertices.push(new THREE.Vector3(
        distance * Math.sin(theta) * Math.cos(phi),
        distance * Math.sin(theta) * Math.sin(phi),
        distance * Math.cos(theta)
    ));
}

Вы можете создать одну петлю для каждой руки. Обратите внимание, что вместо деления на 10 в конце, как вы делали в своем примере, я просто ограничил диапазон phi до [-0.1, 0.1]. Вы можете увидеть это в действии в этой скрипке

23
задан Phillip B Oldham 27 October 2008 в 16:49
поделиться

5 ответов

Спасибо за парней комментариев. Я пошел со следующим:

var EntriesRegistry = (function(){

    var instance = null;

    function __constructor() {

        var
            self = this,
            observations = {};

        this.set = function(n,v)
        {
            self[n] = v;

            if( observations[n] )
                for( var i=0; i < observations[n].length; i++ )
                    observations[n][i].apply(null, [v, n]);

        }

        this.get = function(n)
        {
            return self[n];
        }

        this.observe = function(n,f)
        {

            if(observations[n] == undefined)
                observations[n] = [];

            observations[n].push(f);
        }

    }

    return new function(){
        this.getInstance = function(){
            if (instance == null)
            {
                instance = new __constructor();
                instance.constructor = null;
            }
            return instance;
        }
    }
})();

var entries = EntriesRegistry.getInstance();

var test = function(v){ alert(v); };

entries.set('bob', 'meh');

entries.get('bob');

entries.observe('seth', test);

entries.set('seth', 'dave');

Принятие Ваших комментариев, я буду использовать делегацию события на объектах формы, чтобы обновить реестр и инициировать зарегистрированные методы наблюдения.

Это работает хорошо на меня, до сих пор... может Вы парни видеть какие-либо проблемы с этим?

6
ответ дан 29 November 2019 в 03:05
поделиться

Вы могли присоединить слушателя контейнера (тело или форма) и затем использовать параметр события для реакции на изменение. Вы получаете все совершенство слушателя, но только должны присоединить один для контейнера вместо одного для каждого элемента.

$('body').change(function(event){
    /* do whatever you want with event.target here */
    console.debug(event.target); /* assuming firebug */
 });

event.target содержит элемент, на который нажали.

SitePoint имеет хорошее объяснение здесь делегации события:

делегация события JavaScript является простой техникой, которой Вы добавляете единственный обработчик событий к родительскому элементу, чтобы избежать необходимости добавлять обработчики событий к нескольким дочерним элементам.

2
ответ дан 29 November 2019 в 03:05
поделиться

Поддержка браузеров с мотором Mozilla Object.watch, но я не знаю о перекрестном браузере совместимый эквивалент.

Вы представили страницу с Firebug для понимания точно, что вызывает замедление или "много обработчиков событий" предположение?

1
ответ дан 29 November 2019 в 03:05
поделиться

jQuery просто удивителен. Хотя Вы могли смотреть к Предварительному просмотру Ajax ASP.NET.

функциями Some являются просто .js файлы, никакая зависимость с.NET. Можете быть Вы, мог найти полезным реализация шаблона "наблюдатель".

var o = { foo: "Change this string" };

Sys.Observer.observe(o);

o.add_propertyChanged(function(sender, args) {
    var name = args.get_propertyName();
    alert("Property '" + name + "' was changed to '" + sender[name] + "'.");
});

o.setValue("foo", "New string value.");

кроме того, Клиентские шаблоны готовы использовать для некоторых интересных сценариев.

примечание финала А, это полностью совместимо с jQuery (не проблема с $)

Ссылки: Домашняя страница , Версия я в настоящее время использую

0
ответ дан 29 November 2019 в 03:05
поделиться

Насколько я знаю, нет никаких событий, стрелял в изменения Атрибута объекта (редактирование: кроме, по-видимому, для Object.watch).

, Почему бы не использовать делегацию события везде, где возможный? Таким образом, события на форме, а не на отдельных элементах формы, получая события, поскольку они пузырятся?

, Например (мой jQuery ржав, простите мне за использование Прототипа вместо этого, но я уверен, что Вы будете в состоянии адаптировать его легко):

$(form).observe('change', function(e) {
    // To identify changed field, in Proto use e.element()
    // but I think in jQuery it's e.target (as it should be)
});

можно также получить input и keyup и paste события, если Вы хотите, чтобы он стрелял в текстовые поля, прежде чем они потеряют фокус. Мое решение для этого обычно:

  1. браузеры Gecko/Webkit-based: наблюдают input относительно form.
  2. Также в основанных на WebKit браузерах: наблюдают keyup и paste события на textarea с (они не стреляют input в [1 111] с по некоторым причинам).
  3. IE: наблюдают keyup, и paste на form
  4. Наблюдают change относительно form (это стреляет select с.
  5. Для [1 118] и paste события, сравните текущее значение поля с его значением по умолчанию (чем было его значение, когда страница была загружена) путем сравнения текстового поля value с defaultValue

Редактирование: вот пример кода, который я разработал для предотвращения неизмененного представления формы и т.п.:

, Что лучший способ состоит в том, чтобы отследить изменения в форме с помощью JavaScript?

6
ответ дан 29 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: