Следите за событием создания недвижимости? - PullRequest
5 голосов
/ 15 марта 2011

Мне нужно иметь возможность определить, когда создается объект (не элемент DOM - объект javascript).

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

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

Ситуация такова: страница загружает кучу скриптов. Некоторые из сценариев создают вещи, которые нужны другим сценариям, например:

ThisStuff = (function () {
  // blah blah
   return self;
} ());

Некоторый другой код должен инициализировать этот ThisStuff, когда он доступен, что может быть после завершения загрузки DOM. Пользователю на самом деле не нужен ThisStuff сразу, так что это нормально, когда скрипт завершает загрузку. Поэтому я хотел бы сделать что-то вроде:

$(document).ready(function() {
   wheneverIsAvailable(window,'ThisStuff', function(object) {
       object.init(args);
   })
});

Я понимаю, что есть другие решения этой проблемы (изменение порядка сценариев или загрузка сценариев по требованию), но они сложны из-за архитектуры. Так что меня интересует только способ сделать это по сравнению с другими решениями. Если jQuery предлагает какую-то такую ​​функциональность, это нормально, так как я использую ее.

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

У вас может быть setInterval проверка количества раз в секунду для просмотра определенной переменной. Вы можете проверить, создан ли он, используя obj.hasOwnProperty(prop). Когда он будет создан, вы вызываете функцию и очищаете интервал.

Это может быть грязно, но это также может нормально работать для вас.

Редактировать: Я кодировал это для вас: http://jsfiddle.net/jhXJ2/2/. Также поддерживается передача дополнительных аргументов функции.

window.__intervals = [];

function wheneverIsAvailable(obj, prop, func) {
    var id = (Math.random()+"").substring(2);
    var args = arguments;
    window.__intervals[id] = window.setInterval(function() {
        if(obj.hasOwnProperty(prop)) {
            window.clearInterval(window.__intervals[id]);
            func(Array.prototype.slice.call(args, 3));
            // Call function with additional parameters passed
            // after func (from index 3 and on)
        }
    }, 1000/ 50);
}

wheneverIsAvailable(window, 'test', function() {
    alert(arguments[0]);
}, 'Woot!');

window.setTimeout('window.test = 123', 1000);
0 голосов
/ 15 марта 2011

Это немного надумано, но это может сработать.

Вам потребуется использовать knockoutjs, библиотеку JavaScript.Это потрясающе, но построено для немного другой цели.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...