Javascript can';不要简单地使用ES6 promise来更新ng repeat中的数据?

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和es6承诺的深入列表。在不使用promise的情况下,我的代码可以像下面的代码片段中演示的那样工作。每次单击父对象时,它都会展开子对象(为了简单起见,仅在示例中使用foo和bar)

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迟接受答案。这完全是有道理的。花两周时间接受答案完全可以,不用担心。