迁移到AngularJs 1.3后,ngRepeat中的子元素不再参见指令';s范围

迁移到AngularJs 1.3后,ngRepeat中的子元素不再参见指令';s范围,angularjs,angularjs-scope,angularjs-ng-repeat,Angularjs,Angularjs Scope,Angularjs Ng Repeat,在Angular 1.2中,ngRepeat中的元素可以看到父作用域的函数(isConvoTabActive)。但是,在我切换到1.3之后,它就不再工作了。我查看了迁移指南,但什么也没找到。如何在不使用$parent.isConvoTabActive的情况下修复此问题 app.directive('myDirective',function(){ return { restrict: 'E', scope: { }, controller: ["$scope"

在Angular 1.2中,ngRepeat中的元素可以看到父作用域的函数(isConvoTabActive)。但是,在我切换到1.3之后,它就不再工作了。我查看了迁移指南,但什么也没找到。如何在不使用$parent.isConvoTabActive的情况下修复此问题

app.directive('myDirective',function(){
  return {
    restrict: 'E',
    scope: {
    },
    controller: ["$scope", "$element", "$attrs",
      function($scope, $element, $attrs) {
          $scope.isConvoTabActive = function(convoId) {           
            return convoId == $scope.indexes.activeConvoId;
          };
      }
    },
    template: "<div ng-repeat='(convoId, convo) in convos'>" +
                  "<div ng-if='isConvoTabActive(convoId)'></div>" +
              "</div>",
    replace: true, // replace the directive element
    link: function (scope, element, attrs) {
            scope.indexes = {
                "activeConvoId": "111"
            };
            scope.convos = {
               "111": {
                 "title": "convo 111" 
               },
               "222": {
                 "title": "convo 222"
               }
            };
    }       
  }
})
app.directive('myDirective',function(){
返回{
限制:'E',
范围:{
},
控制器:[“$scope”、“$element”、“$attrs”,
函数($scope、$element、$attrs){
$scope.isConvoTabActive=函数(convalid){
return convalid==$scope.index.activeconvalid;
};
}
},
模板:“”+
"" +
"",
replace:true,//替换指令元素
链接:函数(范围、元素、属性){
scope.index={
“活动车队ID”:“111”
};
scope.convals={
"111": {
“标题”:“车队111”
},
"222": {
“标题”:“车队222”
}
};
}       
}
})
编辑1 我试过ng show,它也不起作用

编辑2 对普朗克有效,我不知道为什么。


您可以使用控制器作为语法,允许您显式引用您的模型/控制器。我的手机上没有链接,也没有输入代码示例,但应该很容易找到


bindToController属性(对于您的指令)是摆脱$scope需求的关键。它将把您的指令属性绑定到控制器实例。

作为一种替代解决方案,可以减少重构,您可以使用ng show(只要您对元素从DOM中隐藏而不是删除没有问题)。ng show不会创建子作用域。

好的,这就是我所说的将控制器用作的示例:

app.directive('myDirective',function() {
  return {
    restrict: 'E',
    scope: {
      indexes: '='
    },
    controllerAs: 'ctrl',
    bindToController: true,
    controller: function() {
      var model = this;
      model.isConvoTabActive = function(convo) {           
        return convo == model.indexes.activeConvo;
      };
    }
  },
  template: "<div ng-repeat='convo in ctrl.convos'>" +
              "<div ng-if='ctrl.isConvoTabActive(convo)'></div>" +
            "</div>"
  }
});
app.directive('myDirective',function(){
返回{
限制:'E',
范围:{
索引:'='
},
controllerAs:'ctrl',
bindToController:对,
控制器:函数(){
var模型=此;
model.isConvoTabActive=函数(conva){
return-conva==model.indexes.activeconva;
};
}
},
模板:“”+
"" +
""
}
});

我添加了这个作为另一个答案,因为格式和空间在注释中是有限的。我知道我不知道一些东西是从哪里来的,或者它们包含什么,例如,“convas”在哪里绑定到范围?这就是为什么我认为plunkr会有帮助。我还做了另一个答案中讨论的更改:只比较对象引用引用而不是ID值(当值类型被复制到范围继承链中时会出现问题)。

在我的例子中,ng if和ng show有相同的结果。它不起作用。你能澄清一下吗?我可以,但我需要一个在手机上不是虚拟键盘的键盘:)我想这里一定还有其他原因。我想这可能是isConvoTabActive函数中的值类型比较。如果只是比较Conva对象,我打赌它会起作用(即跟踪活动Conva而不是id)@natwallbank我在isConvoTabActive中放了一个console.log,但从来没有被调用过。嗯,肯定发生了一些奇怪的事情。我们已经将很多代码移到了1.3,肯定会遇到这个问题。这是一个问题。你能在Plunkr或其他什么东西中复制它吗?我不能在Plunker上复制。我在移动时也遇到了这个问题从1.2.x到1.3,罪魁祸首是
replace:true