controller('SomeController', function($scope, simpleFactory, $routeParams) {
init();
function init() {
var myDataPromise = simpleFactory.getStuff($routeParams.id);
// The method A works fine here
$scope.A = function() {
//return result['someAttrOfResult']
return 90
}
myDataPromise.then(function(result) {
// B is a regular object and works fine
$scope.B = result;
// The method A does not work here
$scope.A = function() {
//return result['someAttrOfResult']
return 90
}
})
}
在我看来,我可以这样做:
<h1>{{B.someAttrOfResult}}</h1>
但不是这样的,除非我在promise块之外创建方法A():
<mydirective value="A()" ></mydirective>
当然我的最终目标是让A()返回对象的任何属性,而不是硬编码值。但即使对返回值进行硬编码也不会在承诺内部起作用。如果我将它移到外面,将其设置为$ scope.B [&#39; someAttrOfResult&#39;]不起作用,因为承诺可能尚未完成。
答案 0 :(得分:0)
我不确定simpleFactory.getStuff方法发生了什么,所以我可能错了,但可能你错过了$ scope。$ apply()调用了#34;解决&# 34 ;.当异步操作完成/失败时,Angular的$ q承诺不会立即被解决/拒绝,但是它们会在下一个$ digest阶段结算。
从例如返回的承诺。 $ http服务没有这个问题,因为他们必须调用已经内置的摘要周期,但是当你使用&#39; raw&#39; $ q服务,您需要使用$ scope手动触发此承诺的结算。$ apply()。希望它有所帮助!
答案 1 :(得分:0)
事实证明有一个拼写错误:(,该指令的原始代码具有以下内容:
scope.$watch('value', function () {
if (scope.gauge) {
scope.gauge.redraw(scope.value);
}
});
当我用函数调用替换{{value}}时,&#34; value()&#34;,我忘记将上面的手表替换为:
scope.$watch('value()', function () {
if (scope.gauge) {
scope.gauge.redraw(scope.value());
}
});
我确实更改了重绘,但不是他的范围。$ watch one。