2013-08-04 1 views
1

Я искал решение о polling data using AngularJS, и я нашел здесь, в stackoverflow.угловая точка обозначение лучше описание

В этом решении (как показано ниже) используется в JavaScript Object, чтобы вернуть ответ (data.response), и если я пытаюсь заменить этот data объект для простого яваскрипта массива он не работает, я бы как точно знать, почему мне нужно пойти с dot notation и почему один массив не работает? (Это было бы большие ссылки или объяснения с примерами)

app.factory('Poller', function($http, $timeout) { 
    var data = { response: {}, calls: 0 }; 
    var poller = function() { 
    $http.get('data.json').then(function(r) { 
     data.response = r.data; 
     data.calls++; 
     $timeout(poller, 1000); 
    });  
    }; 
    poller(); 

    return { 
    data: data 
    }; 
}); 

Пытаясь подвести итог своей цели (то, что я хочу, чтобы действительно понять): где var data = { response: {}, calls: 0 }; может быть var data = {};, а затем response.data будет выставиться непосредственно к данным data = r.data и return {data: data};, почему мне нужно полагаться на точечную нотацию?

+0

я удалить точку, он все еще работает http://plnkr.co/edit/lIltfOWL4YObm5oRB13W?p=preview – zsong

+0

Но вы все еще получить доступ к корыту ответа 'data.response' я имел в виду: вместо' вара данных = {response: {}, calls: 0}; 'be' var data = []; ' –

+0

Я попытался заменить на вашем примере, и теперь он не работает http://plnkr.co/edit/kCV95VJlCpSq6etVNJVf?p=preview –

ответ

7

Скажем, если мы изменим завод в таким образом:

app.factory('Poller', function($http, $timeout) { 
    var d = {}; 
    var poller = function() { 
    $http.get('data.json').then(function(r) { 
     d = r.data; 
     $timeout(poller, 1000); 
    }); 
    }; 
    poller(); 

    return d; 
}); 

В контроллере, оператор $scope.data = Poller; правопреемником d объект $ scope.data, поэтому отношения объекта, как это после инициализации

$scope.data -> d -> r.data 

Когда Poller() снова вызывается в 1 сек, д заменяется новым объектом, поэтому отношения объект будет

$scope.data -> d* -> r.data (d* is a new object) 

поэтому привязка данных angularjs будет нарушена, так как нет никакого способа проследить до r.data, так как d * - совершенно новый объект с другим прототипом.

С обозначением точки после инициализации отношения к объекту никогда не меняются, поскольку периодические вызовы poll() не создают новый объект d, но он просто обновляет поле ответа с помощью нового объекта r.data.

$scope.data -> d.response -> r.data 
+1

** Большое спасибо ** Я не могу проголосовать за вас (и по какой-то причине я не знаю, как повысить вашу репутацию), но я уже отмечаю ваш ответ как правильный. –

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