Пытался зарегистрировать виджет с id == valores0, но этот идентификатор уже зарегистрирован - PullRequest
6 голосов
/ 12 октября 2011

я получаю эту ошибку, и я не знаю, как можно решить. Я прочитал эту ссылку раньше.

EDIT: 1

index.php

<script type="text/javascript">
$(document).ready(function() {   
    $("#customForm").submit(function() {
        var formdata = $("#customForm").serializeArray();

        $.ajax({
            url: "sent.php",
            type: "post",
            dataType: "json",
            data: formdata,
            success: function(data) {
                switch (data.livre) {
                case 'tags':
                    $("#msgbox2").fadeTo(200, 0.1, function() {
                        $(this).html('Empty tags').fadeTo(900, 1);
                    });
                    break;

                default:
                    $("#msgbox2").fadeTo(200, 0.1, function() {
                        $(this).html('Update').fadeTo(900, 1, function() {
                            $('#conteudo').load('dojo/test_Slider.php');   
                        });
                    });
                    break;
                }
            }
        });

        return false;
    });
});
</script>

test_slider.php

<script type="text/javascript">

var slider = [];

for (i = 0; i < 5; i++) {

    slider[i] = (

    function(i) {

        return function() {

            var node = dojo.byId("input"+[i]);
            var n = dojo.byId("valores"+[i]);

            var rulesNode = document.createElement('div'+[i]);
            node.appendChild(rulesNode);

            var sliderRules = new dijit.form.HorizontalRule({
                count:11,
                style:{height:"4px"}
            },rulesNode);

            var labels = new dijit.form.HorizontalRuleLabels({
                style:{height:"1em",fontSize:"75%"},
            },n);

            var theSlider = new dijit.form.HorizontalSlider({
                value:5,
                onChange: function(){
                    console.log(arguments);
                },
                name:"input"+[i],
                onChange:function(val){ dojo.byId('value'+[i]).value = dojo.number.format(1/val,{places:4})},
                style:{height:"165px"},
                minimum:1,
                maximum:9,
                   }
            },node);

            theSlider.startup();
                sliderRules.startup();
        }

    })(i);
    dojo.addOnLoad(slider[i]);
}

</script>

Проблема: сначала нажмите «Отправить», и все работает хорошо, 5 слайдеров импортированы. Второй щелчок, обновление предполагается, но я получаю это сообщение:

Tried to register widget with id==valores0 but that id is already registered

[Демо-видео] 2

Ответы [ 4 ]

3 голосов
/ 21 октября 2011

Просто чтобы добавить ответ @ отсутствующего и комментарий @ Кевина. Вы можете пройтись по существующим диджитам, заглянув в реестр:

var i = i || 0; // Cache this at the end of your loop
dijit.registry.map(function (widget) {
    if (+widget.id.replace(/^[^\d]+/, '') <  i) {
        widget.destroyRecursive();
    }
});
/*
    Your loop fixed as described in missingno's answer.
*/
1 голос
/ 20 октября 2011

Dijit хранит все активные виджеты в dijit.registry и использует идентификаторы в качестве уникальных квалификаторов.Вы не можете создавать диджиты с тем же идентификатором.

Необходимо очистить dojo.registry перед созданием нового слайдера.Добавьте этот код перед объявлением dijit в test_slider.php

dijit.registry["input"+ [i]].destroyRecursive();
1 голос
/ 12 октября 2011

Вы попали в давнюю ловушку создания замыканий функций внутри цикла for.К моменту запуска addOnLoad и создания ползунков i будет равно 2, и оба ползунка будут пытаться использовать одни и те же узлы DOM (что недопустимо).

Необходимо убедиться, чтоВы даете свежую копию i для всех.Ниже приведено быстрое решение:

for(i=0; i<2; i++){
    (function(i){

        slider[i] = ...

        //everything inside here remains the same
        //except that they now use their own i from the wrapper function
        //instead of sharing the i from outside.
    }(i));
}
0 голосов
/ 20 октября 2011

Вы можете назначить любой номер ID, например, идентификатор, сгенерированный из 10-значного случайного числа или чего-либо с комбинацией даты и времени, чтобы идентификатор никогда не был таким.

...