Вопрос о области применения Dojo для store.query с ItemFileWriteStore - PullRequest
0 голосов
/ 30 августа 2011

Я пишу метод для получения самого низкого уникального идентификатора в ItemFileWriteStore.У меня есть логическое значение, чтобы сообщить мне, когда я достигну своего состояния, но я не могу получить правильную область.

Вызов функции работает, как я ожидаю, за исключением того, что для newIdOkay установлено значение true, он не распознаетсяв цикле while.

Пожалуйста, вы можете объяснить, почему и что я должен сделать, чтобы получить это право?

Большое спасибо

Вот мой код:

function checkNewId( size ) {
    if( size == 0 ) {
        console.log('found new ID!');
        newIdOkay = true;
    }
 }

function addContentItem( store ) {    
    // New ID 
    var newIdOkay = false;
    var newId = 0;

    while( newIdOkay == false && newId < 8 ) {
        newId++;
        store.fetch({ query: {id:newId}, onBegin: dojo.hitch(this, "checkNewId"),                          
                      start:0, count:0, sync:true });
    }
} 

1 Ответ

0 голосов
/ 30 августа 2011

Чтобы понять причину, вам нужно иметь базовое понимание разрешения идентификатора и цепочки областей видимости в JavaScript.Я рекомендую вам прочитать эту статью: http://jibbering.com/faq/notes/closures/

Что касается вашего вопроса, в функции addContentItem проверка в цикле while проверяется на идентификатор newIdOkay, который находится в объекте активации.соответствующий этому контексту выполнения функции.В функции checkNewId установленный вами идентификатор newIdOkay находится в глобальном объекте.Так что эти два не одно и то же.Простое решение - переместить функцию newIdOkay in addContentItem в глобальную область видимости.

var newIdOkay = false;

function checkNewId( size ) {
    if( size == 0 ) {
        console.log('found new ID!');
        newIdOkay = true;
    }
 }

function addContentItem( store ) {    
    // New ID 

    var newId = 0;

    while( newIdOkay == false && newId < 8 ) {
        newId++;
        store.fetch({ query: {id:newId}, onBegin: dojo.hitch(this, "checkNewId"),                          
                  start:0, count:0, sync:true });
    }
} 
...