2016-06-07 69 views
0

我在使用角度js的引导模式上出现了一些问题,我想更好地理解为什么scope变量是不更新。我有一个页面(我们称之为主页面),它包含一个可供我选择条目的下拉列表。

<p>@{{serv_id}}</p> 
<select class="form-control" id="serv" ng-model="service_id" ng-change="selectServ()"> 
     <option value="179">Serv 1</option> 
     <option value="180">Serv 2</option> 
     <option value="181">Ser 3</option> 
</select> 
<a href="" class="btn-getnum" data-toggle="modal" data-target="#remote-serv-modal"> 
    Get this serv <span class="glyphicon glyphicon-save"></span> 
</a> 

当用户选择一个条目时,会触发ng-change="selectServ()"函数。这里是该函数的代码这是ng-controller="servController"的一部分:

$scope.selectServ = function(){ 
     serv_id = $('#serv').val(); 
     $http.get('/serv/next-serv/' + serv_id).success(function(response){ 
      setTimeout(function(){ 
       $scope.serv_id = serv_id; 
       $scope.$apply() 
       $scope.selectServ(); 
      }, 5000); 

     }); 
    }; 

当用户选择一个条目,<p>@{{serv_id}}</p>主页上找到更新输出。但是,在我的主页中使用@include('modals.remote-queue-modal')包含在我的模式中的范围变量$scope.serv_id不会更新。

这里是一个正在另一个刀片发现模态代码:

<div class="modal fade" id="remote-serv-modal" tabindex="-1" ng-controller="servController"> 
     @{{serv_id}} 
</div> 

我不包括我的模式的所有代码,但它有一个引导模式中的所有元素(对话框,标题和内容)。上面代码的重要部分是它有一个ng-controller和scope变量。

我在做什么错?任何人都可以指出我的资源是非常感谢。

+1

$ scope.selectServ()的用途是什么。现在它真的没有做任何事情。它创建一个http.get调用,但对返回数据没有任何作用。它设置$ scope.serv_id等于$('#serv')。val(),因为$('#serv')。val()与您的模型的一部分$ scope.service_id相同,所以这是不必要的。除此之外,你还没有向我们展示你的模态的代码,这是你认为你的问题在哪里。 – jbrown

+2

摆脱bootstrap.js并使用angular-ui-bootstrap。并停止在控制器中使用jQuery。那里不应该有DOM代码。你的数据模型应该是驱动dom而不是其他方式 – charlietfl

回答

0

你遇到的主要问题是你正在操作的角度以外的东西,所以你要么通过超时应用您的更改或只是做更多的角度的方式。

快速回答

angular.module('snrApp').controller("servController", ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { 
    $scope.selectServ = function(){ 
     var serv_id = $('#serv').val(); 
     $http.get('/serv/next-serv/' + serv_id).success(function(response){ 
      $timeout(function(){ 
       $scope.serv_id = serv_id;//what's the point of this? 
      , 5000); 
     }); 
    }; 
}]); 

我还修改了代码更内嵌在角方式。

更好的答案

修改后的HTML代码

<p>@{{serv_id}}</p> 
<select class="form-control" id="serv" ng-model="service_id" ng-change="selectServ(service_id)"> 
     <option value="179">Serv 1</option> 
     <option value="180">Serv 2</option> 
     <option value="181">Ser 3</option> 
</select> 
<a href="" class="btn-getnum" data-toggle="modal" data-target="#remote-serv-modal"> 
    Get this serv <span class="glyphicon glyphicon-save"></span> 
</a> 

控制器

angular.module('yourApp').controller("servController", ['$scope', '$http', '$timeout', 'yourServletService', function ($scope, $http, $timeout, yourServletService) { 
    $scope.selectServ = function(service_id){ 
     yourServletService.get(service_id, function(servlet){ 
      $scope.serv_id = service_id;//what's the point of this? 
     }); 
    }; 
}]); 

例如服务,为你的servlet

angular.module('yourApp').factory("yourServletService", [ 
    '$http', function($http) { 
     return (function(ext) { 
      return ({ 
       get: get 
      }); 

      function get(service_id, success, error) { 
       var request = $http('/serv/next-serv/' + service_id); 
       return request.then(function(res){ 
        if(success){ 
         success(res.data); 
        } 
       }, function(res){ 
        if(error){ 
         error(res.data); 
        } 
       }); 
      }; 
     }); 
    } 
]); 

此外,我不知道我如果它是有意或无意的,但你同时拥有“service_id”和“serv_id”,这些都是大部分时间。

+0

但是OP已经调用了$ apply()。既不是OP的方法或这个答案是正确的角度的方法,因为应该使用'$超时'服务而不是'setTimeout' – charlietfl

+0

@charlietfl我同意应该使用$超时,但这是我的快速回答他的问题,以解决少数这些作品让他理解什么是初始问题。我的下面的回答为他提供了一个更好的方式,而不是完全使用超时。 –

+0

@BryanEuton - “他做事情的更好方式”不应该包含像serv_id = $('#serv')这样的代码val() – jbrown

相关问题