基本上我想做的是从解析承诺的函数调用中分配一些模型值。像这样
value = someFun()
这是我调用此函数的服务
app.factory('SomeService', function($q) {
return {
someFun: function() {
var d = $q.defer();
try {
d.resolve("hi");
} catch (e) {
d.reject(e);
}
return d.promise.then(function(text){
return text;
});
}
};
});
这是 HTML 代码
<div ng-init="value = 'yes'">
<pre>{{value |json}}</pre>
</div>
<button type="button" ng-click="value = someFun()">click me</button>
这是在控制器中
$scope.someFun = SomeService.someFun;
这是plnkr
http://plnkr.co/edit/qO5ofBXZDsi3cS3bBnT8 http://plnkr.co/edit/qO5ofBXZDsi3cS3bBnT8
现在它返回一个空对象。怎么了?
编辑:正如下面已经回答的那样,是的,这是一种方法,但是假设我想在 ngRepeat 中调用 SomeService.someFun ?
编辑2:这是答案 -> ngRepeat 内的 Angular UI Bootstrap 模式 https://stackoverflow.com/questions/25329596/angular-ui-bootstrap-modal-inside-ngrepeat
一般来说,如果您想使用异步更新的内容来显示在视图中,而不必编写控制器代码(您的问题就是这种情况,因为您想调用 ng-view 内的函数),那么您需要返回一个空白占位符对象,并将 Promise 的结果合并到其中,或者更新您可以在视图中引用的该对象的属性。
您的问题太抽象,无法知道解决此问题的确切方法对您的应用程序有意义,但这是一般(和抽象的)想法笨蛋在这里 http://plnkr.co/edit/ZvodQUzI5pdfhldtRINM?p=preview:
.factory('promiseService', function($q){
return {
someDeferredThing: function(){
var placeholder = {};
var d = $q.defer();
d.promise.then(function(text){
placeholder.text = text;
});
d.resolve("hi");
return placeholder;
}
}
)
该服务返回一个由承诺更新的对象,并且not本身就是一个承诺。如果你返回一个承诺,那么你必须处理.then()
等等来获取值。
.controller('appCtrl', function($scope, promiseService){
$scope.deferredResult = promiseService.someDeferredThing();
});
这就是将值分配给范围的方式。
$scope.deferredResult.text
在承诺解决之前将是未定义的,然后它将被定义并解决"text"
。因此,您的视图应该在短时间内处理未定义的状态 - 通常很简单ng-show
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)