2013-10-16 38 views
0

所以这是我的工厂代码:运行代码后先

app.factory('simpleFactory', function ($http) { 
    var factory = {}; 

    factory.getArray = function (srchWord) { 

     **Here i have a code that uses $http to fill a array called result with values. 

      return result; 
     }; 

    return factory; 
}); 

这是我的范围内的代码:

$scope.search = function() { 

     $scope.arrayValue = simpleFactory.getArray($scope.searchWord); 

     $scope.booleanValue = ($scope.arrayValue.length <= 0); // <-- PROBLEM! This gets executed before getArray() is finished. 

}; 

我的问题是$scope.booleanValue = ($scope.arrayValue.length <= 0)$scope.arrayValue已从$simpleFactory.getArray($scope.searchWord)获得其价值之前执行。
所以我的问题是我怎么能等到功能的getArray完成火我的代码:

$scope.arrayValue = simpleFactory.getArray($scope.searchWord); 

回答

1

首先从工厂方法getArray返回promise

app.factory('simpleFactory', function ($http) { 
    var factory = {}; 

    factory.getArray = function (srchWord) { 

     return $http.query(....); // this returns promise; 
     }; 

    return factory; 
}); 

其次等待承诺解决使用然后。

scope.arrayValue = simpleFactory.getArray($scope.searchWord).then(function(data) { 
    $scope.arrayValue=data; 
    $scope.booleanValue = ($scope.arrayValue.length <= 0); 
}); 

阅读有关什么promise是,如何$http使用它们。

+0

谢谢,我读到的承诺,并设法解决这个问题:d – Erex

1

您可以将布尔值设置为getArray函数的回调,也可以在arrayValue上设置监视并根据该值更新booleanValue。

$scope.search = function() { 

    simpleFactory.getArray($scope.searchWord, function(result) { 
     $scope.arrayValue = result; 
     $scope.booleanValue = ($scope.arrayValue.length <= 0); 
    }); 

    // or 

    // initialize the value 
    $scope.arrayValue = []; 

    // *then* set the value, so it triggers the change on the $watch below  
    $scope.arrayValue = simpleFactory.getArray($scope.searchWord); 

    $scope.$watch('arrayValue', function(newValue,oldValue) { 
     $scope.booleanValue = (newValue.length <= 0); 
    }); 

}; 
+0

我想第二个选项,但我总是得到一个空数组,即使arrayValue不是空的...任何想法? – Erex

+0

我的编辑应该可以工作。 – Sharondio

+0

它与oldValue协同工作,但随后一直落后于后面一步:P 出于某种原因,newValue总是返回一个空数组:/ – Erex