以角度更改控制器变量

时间:2015-06-05 16:43:27

标签: javascript jquery angularjs

angular.module('myApp', []).controller('namesCtrl', function($scope) {
$scope.names = [
    {name:'Jani',country:'Norway'},
    {name:'Hege',country:'Sweden'},
    {name:'Kai',country:'Denmark'}
];
});

function abc(){
 $.ajax({url: "demo_test.txt", success: function(result){
     $scope.names = result; // here
 }});
}

我想通过result更改scope.names的内容(它将采用json格式),然后通过angular渲染内容。

我想澄清一下我必须在函数内部使用get请求,所以不能使用$ http of angular

3 个答案:

答案 0 :(得分:1)

使用$http代替ajax,因为$http负责运行摘要周期,负责双向绑定。

function abc(){
  $http.get("demo_test.txt")
  .then(function(result){
     $scope.names = result;
  });
}

如果由于某种原因您无法使用$http,则必须调用$scope.$apply方法来设置范围值,因为它在内部运行摘要周期。

function abc(){
 $.ajax({
    url: "demo_test.txt", 
    success: function(result){
      $scope.$apply(function () {
         $scope.names = result;
      });
    }
 });
}

如果你的控制器外面有abc方法,那么你必须得到如下所示的控制器范围,但不是角度推荐的。

function abc(){
 var $scope = angular.element('[ng-controller=namesCtrl]').scope();
 $.ajax({
    url: "demo_test.txt", 
    success: function(result){
      $scope.$apply(function () {
         $scope.names = result;
      });
    }
 });
}

答案 1 :(得分:0)

你需要一些东西让Angular知道它需要注意那个变化。 Angular的方法是使用$http,但您也可以使用$scope.$watch

答案 2 :(得分:0)

我知道您无法访问该范围。您需要使用angular.element('[ng-controller=namesCtrl]').scope()以hacky方式访问范围,然后您将对范围进行实际控制,但范围中的变量更改将不会运行摘要周期,您需要使用{{}手动运行它1}}在那个范围内。

<强>代码

$apply()