迁移到AngularJs 1.3后,ngRepeat中的子元素不再参见指令';s范围
在Angular 1.2中,ngRepeat中的元素可以看到父作用域的函数(isConvoTabActive)。但是,在我切换到1.3之后,它就不再工作了。我查看了迁移指南,但什么也没找到。如何在不使用$parent.isConvoTabActive的情况下修复此问题迁移到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"
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
。