2015-06-08 53 views
1

我需要在範圍內有一個函數,其結果將異步更改。

必須將函數用作表達式,所以我不能使用單個屬性。

在我的示例中,該函數返回將異步修改的對象的屬性。雖然在整個摘要循環中該值相等,但這會執行摘要錯誤。 這裏的例子: http://plnkr.co/edit/YmyroMiMyMzUaLW4tc7V(注意:它可能掛你的瀏覽器)

myApp.controller('Ctrl1', ['$scope', '$http', function($scope, $http) { 
    var myObj = {found:false}; 
    $scope.util = {}; 

    $scope.util.asyncFunc = function(){ 

     $http.get('http://localhost').then(changeValue,changeValue); 

     return myObj.found; 
    } 

    function changeValue(){ 
     myObj.found = true; 
    } 
}]); 

任何想法如何解決呢?

+1

這是一個異步函數嗎?它會返回false ....但是在2secs之後它會將對象引用'myObj.found'更改爲true。爲了使它異步,從它返回'$ promise'。 –

+0

你能展示如何在模板中使用控制器代碼嗎?什麼是約束? –

+0

你正在做簡單的事情。每個'$ timeout'都會產生一個'$ digest()',並且每個'$ digest()'都會重新計算所有角度表達式,這些表達式會導致另一個''超時值''用於您的情況等等。這意味着它將簡單地達到'$ digest()'迭代 – Samir

回答

0

我有一個解決方案,問題是執行所有的時間$ http.get,它創建的承諾,將在同一時間解決。所以,首先我通過檢查承諾是否已經創建來解決問題。之後,在promise的回調函數中,我設置了var來控制如果將promise創建爲null,但是我重新定義了一個返回相同值的橋接函數,以避免在同一個$ digest中執行$ http.get: http://plnkr.co/edit/LOXDzVC4do2GTRtyNgSU

var myApp = angular.module('myApp', []); 
//nueva 2015-06-09 
myApp.controller('Ctrl1', ['$scope', '$http', '$q', function($scope, $http, $q) { 
    var myObj = {found:false}; 
    $scope.util = {}; 
    var pro; 
    $scope.util.asyncFunc = doGet; 



    function doGet(param1, param2){ 
     if(!pro){ 
     pro = $http.get('http://localhost').then(changeValue,changeValue); 
     } 

     return myObj.found; 

     function changeValue(){ 
     if(param1 !== "2"){ 
      myObj.found = true; 
     }else{ 
      myObj.found = false; 
     } 


     $scope.util.asyncFunc = function(param1, param2){ 
      $scope.util.asyncFunc = doGet; 
      pro = null; 

      return myObj.found; 
     } 
    } 
    } 
}]); 

和HTML:

<body> 
    <div ng-controller="Ctrl1"> 
      <br/><br/> 
      Param1:<input type="text" ng-model="model.param1" /> 
      Param2:<input type="text" ng-model="model.param2" /> 

     AsyncFunc: {{util.asyncFunc(model.param1, model.param2)}} 
    </div> 

    <script src="http://code.angularjs.org/1.2.26/angular.js"></script> 
    <script src="script.js"></script> 
    </body> 

嗯,我認爲這肯定不是最好的解決辦法,如果你有其他的辦法,將是非常有益的。

+0

這裏另一個難看的問題是,當我們改變輸入值時,http get被執行2次。 –