2016-06-07 70 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

相關問題