2013-04-17 4 views
1

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

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

Однако, когда я смотрю обещание, оно, похоже, регистрирует изменение, но затем сразу устанавливается на «undefined».

См http://plnkr.co/edit/eOjkuvyrQvKhkAbVLGVG?p=preview

Как вы можете видеть шаблон обновляется без проблем, но если вы проверяете консоль, смотреть «isNotAPromise» работает, как ожидалось, но часы «isAPromise» срабатывает в два раза, и с «неопределенный».

Любые подсказки?

Вот код, чтобы сделать так счастлив:

app.controller('MainCtrl', function($scope, $q) { 
    var c; 
    c = 1; 
    setInterval(function() { 
    c = c + 1; 
    console.log('---------------'); 
    console.log(['c changed to ', c]); 
    return $scope.$apply(function() { 
     $scope.isNotAPromise = c; 
     return $scope.isAPromise = $q.when(c); 
    }); 
    }, 1000); 
    $scope.$watch('isAPromise', function(newVal, oldVal) { 
    return console.log(['isAPromise changed', oldVal, newVal]); 
    }); 
    return $scope.$watch('isNotAPromise', function(newVal, oldVal) { 
    return console.log(['isNotAPromise changed', oldVal, newVal]); 
    }); 
}); 

Спасибо, Рой

+0

Это связано с жизненным циклом AngularJS. Есть другие ответы SO об этом. $ Watch вызывается как минимум дважды в начале, поэтому у вас может быть чек для неопределенного и для newval == oldval. – jpmorin

+0

Спасибо jpmorin, но этот вопрос больше связан с различиями между обещаниями и не обещаниями - значения, возвращаемые на часы для этих сценариев, различны –

ответ

2

Я добавил метку времени, чтобы определить, когда были запуск двух часов: выход

console.log [+new Date(), 'isAPromise changed', oldVal, newVal] 

Пример:

["c changed to ", 3] app.js:12 
[1366223960472, "isAPromise changed", 2, undefined] app.js:19 
["isNotAPromise changed", 2, 3] app.js:22 
[1366223960473, "isAPromise changed", undefined, 3] 

Итак, два часа на isAPromise стреляют на расстоянии 1 миллисекунду. Я предполагаю, что происходит то, что когда $q.when(c) присваивается сначала $scope.isAPromise, это undefined, потому что обещание еще не разрешено. Затем обещание разрешается (вероятно, в течение всего цикла $ digest), а isAPromise затем устанавливается на значение обещания (разрешено?).

+0

Возможно, это так. У меня есть еще несколько идей для тестов - будет обновлен вопрос с теми, после того как я их «запишу» –

Смежные вопросы