2015-05-06 3 views
0


Я хочу создать динамическую страницу (именно поэтому я использую angular.js) в соответствии с данными из моей базы данных localhost. Я подключение к моей БД с помощью JQuery функции Ajax вызова:Задайте значение в угловом формате с помощью jQuery ajax

var ajaxCall = function(request,datas,async,onSuccess){ 
    $.ajax({ 
     async: async, 
     url: 'data.php', 
     type: "POST", 
     data: { 
      request: request, 
      datas: datas 
     }, 
     dataType:"json", 
     success:function(returns){ 
      if(onSuccess != null) 
       onSuccess(returns); 
     } 
    }); 
}; 


Это мой угловой файл, в то числе ajaxCall получить мои значения:

(function(){ 
    var app = angular.module('user', [ ]); 

    app.controller('MemberController', function() { 
     var user= this; 
     user.members= []; 

     ajaxCall("getMember",null,false,function(result){ 
      for(var number in result) 
       user.members.push(result[number]); 
     }); 

     setTimeout(function(){ 
      console.log(user.members) 
     }, 2500); 
    }); 
})(); 


От вызова Ajax, я получить JSON (действительный на JSONLint), но в моем угловом коде, когда я console.log(user.members) (даже с TimeOut в несколько секунд), значение массива по-прежнему [], и я не могу использовать его на моей странице html.

У вас есть идеи, почему? Или как я могу изменить свой код, чтобы он работал? Спасибо !

+0

вы можете разместить угловую контроллер слишком – sanjeev

+0

Пожалуйста, введите свои 'console.log' прямо перед закрытием'}); 'вашего примера кода. Это было бы единственное правильное место для проверки user.members – devnull69

+3

Люди, перестали смешивать jQuery и Angular. Прекратите использование ajax jQuery вместо услуги Angular $ http. _Unload_ jQuery и найти 100% Угловой способ делать вещи. –

ответ

1

enter link description here Внутри вашего AJAX обратного вызова вы должны сказать Угловое, что вы изменили это модель , вне Углового мира.

ajaxCall("getMember",null,false,function(result){ 
      for(var number in result) 
       user.members.push(result[number]); 
      $scope.$apply(); // this will tel Angular to loop for changes in $scope 
     }); 

Но я призываю вас, чтобы заменить его на $ HTTP вызова:

app.controller('MemberController', function($http) { 

     $scope.members = []; 

     $http.post("data.php" ,{ request: request, datas: datas }) 
     .success(function(result){ 
      console.debug(result); 
      for(var i=0; i<result.length; i++) 
       $scope.members.push(result[i]); 
     }); 
    }); 

С помощью этого кода вам не нужно звонить $apply, потому что $ НТТР Угловое обслуживание и $apply будет называемый автоматическим в конце предиката успеха.

Подробнее о $http.get с аргументами можно найти here. $http с почтой внутри этого ответа.

Обновление:

Вы должны назначить член контроллера $scope, таким образом ваши результаты будут видны на представлении (я обновил свой код).

Во-вторых вы сказали, что ваши действия на стороне сервера является операция чтения, в этом случае заменить ваш POST с GET, например, так:

$http.get("data.php" ,{params: { request: request, datas: datas } }) 

Помните:

  1. POST - когда вы удалить, добавить, обновить модель
  2. GET - когда вы читаете объекты

удачи :)

+1

Seco ndly, при работе с AJAX, не доверяйте таймауту, чтобы проверить его результаты, вам нужно изменить свою логику и использовать полученные данные внутри предиката succes, а не ждать x секунд. – Beri

+0

Это очень помогло мне. Но еще одна вещь: я редактировал свой пост, чтобы показать вам свою функцию ajaxCall, и я не знаю, как сделать инъекцию $ http похожим на нее (значения $ _REQUEST и тому подобное), у тебя есть идеи ? – tektiv

+0

@tektiv Я обновил ответ, посмотрим, поможет ли он. Как вы можете видеть, Angular короче, и код по-прежнему читаем :) – Beri

0

Это не мой любимый способ сделать это, но в вашем случае вызова:

$scope.$apply(); 

После того как вы обновили вашу коллекцию.

Я думаю, что происходит то, что Angular должен запускать цикл дайджеста, чтобы обновлять представления, и прямо сейчас вы не сказали ему сделать это, потому что вы используете прямой вызов ajax. Если ваш вызов был инициирован угловым событием «ng-», тогда он узнает, что материал продолжается и дождитесь завершения звонков ... перед обновлением представлений для себя.

Так что попробуйте $ scope. $ Apply(); сначала, и если вы можете вызвать свою функцию обновления с помощью ng-click или что-то попробовать, не используя $ scope. $ apply(); и посмотреть, работает ли это.

Тогда вы должны смотреть в использовании $ HTTP, чтобы сделать REST звонки лично мне нравится нг-ресурса дополнительного модуля ...

+0

Смотрите мой комментарий выше. Это то, что происходит, когда вы смешиваете jQuery и Angular. JQuery находится вне «мира» Углового, и вам нужны грязные трюки, такие как '$ scope. $ apply()', чтобы возиться и заставить все работать. Определенно, это не так. Ответ правильный, обратите внимание. –

+0

Возможно, правда, но это все часть процесса обучения, и я не хотел предлагать решение: все это дерьмо, переписывать все ... поэтому постарайтесь найти решение для jQuery ajax call, таким образом мы все можем узнать, как все работает, а затем сделать суждение о том, какую технологию использовать в другом экземпляре. –

+0

Я согласен, я сказал, что ваше решение работает. Но поскольку OP учится (как и все мы), мой лучший совет: STOP, удалите jQuery и найдите угловой способ сделать вещи. Tring для смешивания обоих не принесет пользы, и это не лучший способ узнать. –

0

var app = angular.module('app', []); 
 

 
app.controller('yourController', ['$scope', '$http', 
 
    function($scope, $http) { 
 
    $scope.user = { 
 
     data: [] 
 
    }; 
 
    $http.get('http://echo.jsontest.com/one/1/two/2/three/3').success(function(results) { 
 
     console.log(results); 
 
     for (var number in results) 
 
     $scope.user.data.push(results[number]); 
 
    }); 
 
    } 
 
]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<html ng-app="app"> 
 

 
<body ng-controller="yourController"> 
 

 
    {{user.data}} 
 

 
</body> 
 

 
</html>

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