【发布时间】:2015-03-17 00:09:45
【问题描述】:
我试图在用户从选择菜单中进行选择之后触发一些代码。因此,我尝试使用 Promise 和 $scope.$watch 函数。我正在解决那个 watch 函数中的 promise,但是 promise 的 then 函数没有被触发。 $scope.$apply() 在这种情况下似乎不起作用。 我怎样才能让这个 then 函数触发?
代码如下:
var nameSpace = angular.module("test", []);
nameSpace.controller("DataRetriever", ['$scope','$http', '$q', function($scope, $http, $q)
{
$scope.options = ["1","2","3"];
$scope.displayText = false;
console.log("options set");
var deferred = $q.defer();
$scope.selectedOption = "";
$scope.$watch("selectedOption", function (newValue, oldValue) {
if (newValue != "") {
deferred.resolve(newValue);
console.log("Resolve called! New value: ", newValue);
} else {
deferred.reject("Invalid option!");
}
});
deferred.promise.then(function(data){
$scope.displayText = true;
console.log("Then success callback function executed!");
});
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test" ng-controller="DataRetriever as dr">
<select ng-model="selectedOption"><option ng-repeat="option in options">{{option}}</option>
</select>
<div ng-show="displayText">Then success callback function executed!</div>
</div>
【问题讨论】:
-
你可以认为 $watch() 调用是给你一个承诺,当用户改变一个暴露在作用域上的值时它会被调用。它不适合你吗?
-
也许你有什么想法,但我还是想问一下。
-
@Werlang 我猜可能 OP 正在尝试实现更改事件处理程序。
-
@PSL 好吧,我对这个很感兴趣。希望他能给个理由。
-
实际上我尝试有几个选择元素。只有一次 每个 选择元素都有一个选择的选项,才应该使用这些选择元素的值发出 HTTP GET 请求。而且由于我可以通过 $q.all(promises) 检查是否所有承诺都已解决,然后才调用一个函数,所以我认为我应该使用它们。现在,由于我需要在选择元素的值发生更改后立即再次触发请求,因此我尝试使用 $watch 来实现此目的。
标签: javascript angularjs promise watch