Javascript can';不要简单地使用ES6 promise来更新ng repeat中的数据?
我正在尝试建立一个包含angular和es6承诺的深入列表。在不使用promise的情况下,我的代码可以像下面的代码片段中演示的那样工作。每次单击父对象时,它都会展开子对象(为了简单起见,仅在示例中使用foo和bar)Javascript can';不要简单地使用ES6 promise来更新ng repeat中的数据?,javascript,angularjs,promise,ecmascript-6,angular-promise,Javascript,Angularjs,Promise,Ecmascript 6,Angular Promise,我正在尝试建立一个包含angular和es6承诺的深入列表。在不使用promise的情况下,我的代码可以像下面的代码片段中演示的那样工作。每次单击父对象时,它都会展开子对象(为了简单起见,仅在示例中使用foo和bar) angular.module('demo',[]) .controller('DemoController',['$scope','dataService',function($scope,dataSvc){ $scope.entities=dataSvc.loadInitia
angular.module('demo',[])
.controller('DemoController',['$scope','dataService',function($scope,dataSvc){
$scope.entities=dataSvc.loadInitialData();
}])
.directive('drillDown',['$compile','dataService',function($compile,dataSvc){
返回{
限制:“A”,
范围:{
实体:'='
},
控制器:功能($scope){
$scope.load=函数(){
this.entity.subEntities=dataSvc.load();
};
},
编译:函数(元素){
var contents=element.contents().remove();
var=null;
返回函数(范围、元素){
如果(!编译){
compiled=$compile(目录);
}
已编译(范围、函数(克隆){
元素。追加(克隆);
});
};
},
模板:
“”+
'' +
“
”+
“ ”
};
}])
.service('dataService',function()){
this.loadInitialData=函数(){
返回[
{
名称:“foo”,
子实体:[]
},
{
名称:'酒吧',
子实体:[]
}
];
};
this.load=函数(){
返回此.loadInitialData();
};
});代码>
可能是因为您在回调函数中处于角度世界之外
dataSvc.load().then(function(res) {
s.entity.subEntities = res;
});
这不是最好的解决方案,但如果调用$scope.$apply()
,它应该可以工作:
dataSvc.load().then(function(res) {
s.entity.subEntities = res;
$scope.$apply()
});
带有$scope.$apply()的JSFIDLE:)
最好的解决方案是使用$q
从angularjs文档:
“$q在angular中与$rootScope.Scope模型观察机制集成,这意味着分辨率或拒绝更快地传播到模型中,并避免不必要的浏览器重新绘制,这将导致UI闪烁。”这需要ES6承诺公开用于设置调度程序的挂钩(就像蓝鸟承诺的)或者公开“post-then”钩子——这两者都不是公开的
您必须通过执行以下操作将ES6承诺强制为$q
:
$q.when(dataSvc.load()).then(...
或者,您可以编写一个帮助程序,将其绑定到作用域:
var withDigest = function(fn){
fn().then(function(){
$rootScope.evalAsync(angular.noop); // schedule digest if not scheduled
});
};
然后做:
withDigest(function(){
return dataSvc.load().then(...
});
嗯,但是如果$scope.$apply是必需的,那么在你双击该项之后它怎么会工作呢?根据我对angular的理解,如果是必需的,那么无论你点击该项多少次,它都不应该工作。不,不,不做$scope.$apply,永远不做$scope.$apply,它只属于连接一次,在每个中都写下它。那么是一个terr可能的想法。@Sukima你们在大多数断言上都是不正确的(Angular没有内置Q,它有$Q,这是不同的,ES6不是“较低级别”等等)。好吧,ES6承诺是一个比许多库(包括$Q)更少功能完整的实现以API为基础。既然Angular附带$q,为什么不使用它并在整个代码中保持一致。似乎避免使用库的内置术语是在与框架工作作斗争。sry迟接受答案。这完全是有道理的。花两周时间接受答案完全可以,不用担心。