Плагин jQuery, Создающий - различные варианты Набора для различных элементов

Я создал плагин jQuery, который работает отлично за исключением способности назвать плагин на различных объектах и каждом объекте, сохраняющем опции, которые это было дано. Проблема состоит в том, что, если я называю плагин на одном объекте, скажите:

$('#myDiv1').myPlugin({
    option1: 'some text',
    option2: true,
    option3: 'another option value'
});

затем назовите плагин снова на другом объекте, скажите:

$('#myDiv2').myPlugin({
    option1: 'different text',
    option2: false,
    option3: 'value for myDiv2'
});

Затем, если я возвращаюсь и пытаюсь сделать что-то с #myDiv1, которому нужны его исходные опции все еще быть неповрежденным, т.е.:

$('#myDiv1').myPlugin.update();

это не будет иметь, это - исходные опции, но они будут переопределены опциями для #myDiv2. Что надлежащий путь состоит в том, чтобы сделать это так, чтобы каждый объект сохранил исходные опции, данные ему? (И вот некоторый пример кода того, что я делаю в плагине),

(function($) {
$.fn.myPlugin = function(options) {

    // build main options before element iteration
    var opts = $.extend({}, $.fn.myPlugin.defaults, options);

    _option1 = opts.option1;
    _option2 = opts.option2;
    _option3 = opts.option3;

    // iterate all matched elements
    return this.each(function() {
        callPluginFunctions( this, opts );
    });

};

    ....code continued....

Я понимаю, что это - некоторое расползание границ проекта или что-то. Так, как я получаю свои опции остаться присоединенным и остаться в пределах исходного объекта (т.е. #myDiv1), что они были склонны.

Править: В проведении некоторого исследования я вижу, что можно хранить данные к объекту с помощью функции .data jQuery, и в документах говорится, что jQuery UI использует его экстенсивно. Правильный поступок здесь был бы хранилищем опции на объекте с помощью .data, затем, когда ссылается более позднее использование опции, сохраненные в .data???

8
задан Ryan 29 January 2010 в 19:37
поделиться

3 ответа

Перед выполнением любых вызовов, включая импорт моделей, необходимо настроить настройки Django. Что-то вроде этого:

from django.conf import settings
settings.configure(
    DATABASE_ENGINE = 'postgresql_psycopg2',
    DATABASE_NAME = 'db_name',
    DATABASE_USER = 'db_user',
    DATABASE_PASSWORD = 'db_pass',
    DATABASE_HOST = 'localhost',
    DATABASE_PORT = '5432',
    TIME_ZONE = 'America/New_York',
)

Еще раз перед запуском обязательно запустите этот код, например:

from your_app.models import *

Затем просто используйте API DB как обычно.

-121--921150-

Я нашел абсолютно фантастическую библиотеку http://jung.sourceforge.net , см. javadoc http://jung.sourceforge.net/doc/api/index.html . Это гораздо больше, чем просто графическая реализация. С его помощью можно визуализировать и раскладывать графики; плюс, он имеет множество стандартных алгоритмов графов, которые вы можете использовать из коробки. Иди, проверь! Хотя в итоге я реализовал свой собственный базовый график (раньше я не знал о JUNG), я использую эту библиотеку для визуализации. Выглядит очень аккуратно!

-121--1843381-

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

(function($){
var defaultOptions = { /* default settings here */ };

//called on the native object directly, wrap with $(obj) if needed.
function initializeObject(obj, options) {
  //assign the options to the object instance.
  $(obj).data('myPlugin-options', $.extend(defaultOptions, options) );
  //do other initialization tasks on the individual item here...
}

function updateObject(obj) {
  // use $(obj).data('myPlugin-options');
}

function setOption(obj, key, value) {
  var d = $(obj).data('myPlugin-options');
  d[key] = value;
  $(obj).data('myPlugin-options', d);
}

$.fn.myPlugin = function(command, option, val) {
  if (typeof command == "object") {
    //initialization
    return this.each(function(){
      initializeObject(this, command);
    });
  }
  if (typeof command == "string") {
    // method or argument query
    switch (command.toLowerCase()) {
      case 'option':
        //get value, return the first item's value
        if (typeof val == undefined) return this.eq(0).data('myPlugin-options')[option];
        //set option value
        return this.each(function() {
          setOption(this, option, val);
        });

      case 'update':
        return this.each(function() {
          updateObject(this);
        });
      //other commands here.
    }
  }
}
})(jQuery)

В приведенном выше примере имеется общий шаблон для расширения jQuery. Обычно для использования рекомендуется использовать следующее соглашение.

Initialization:
  $(...).myPlugin({ initialization-options-here });
Command:
   $(...).myPlugin('command-name'); //where command can be update, etc.
Get Option:
  var myValue = $(...).myPlugin('option', 'option-name');
Set Option:
  $(...).myPlugin('option', 'option-name', newValue);

Обновлено для использования .data off каждого отдельного объекта.

16
ответ дан 5 December 2019 в 11:24
поделиться

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

В любом случае, чтобы дополнительно объяснить, что означало ~ ReierierPost, изменяя ваш код для этого должен работать. Вам придется пройти «Opts» повсюду, но я думаю, что это необходимо, чтобы выделить параметры из широкого пространства имен типа плагинов.

$.fn.myPlugin = function(options) {

    // iterate all matched elements
    return this.each(function() {
        // build main options before element iteration
        var opts = $.extend({}, $.fn.myPlugin.defaults, options);
        callPluginFunctions( this, opts );
    });
};

Отредактируйте: Вот код из моего плагина

this.each(function() {
    var thisConfig = config;
    thisConfig = $.extend(thisConfig,settings);
    $.attach($(this),thisConfig);
});

...

$.attach = function($target,config){

, поэтому у меня нет подключаемого «конфигурация» - просто внутри каждой функции.

0
ответ дан 5 December 2019 в 11:24
поделиться

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

-1
ответ дан 5 December 2019 в 11:24
поделиться
Другие вопросы по тегам:

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