2013-03-20 149 views
4

我一直在试图影响父范围中的变量来切换指令内的ng-show。该指令是包含ng-repeat指令的自定义指令。这个想法是,一旦ng-repeat结束,我想隐藏包含div的元素以及其中的元素。AngularJS指令绑定

这里有一个Plunkr证明我的情况:http://beta.plnkr.co/edit/C42Z25?p=preview 而且,这里的中的jsfiddle比较,它使用了同样的问题,但它不是一个NG重复,所以它的工作原理:http://jsfiddle.net/dyzPC/

因此,有几个问题。在我的指令中,我必须使用scope.$parent.showMe = true来更改父范围的showMe,我似乎无法仅使用scope.showMe = true来设置它。我尝试了隔离范围,没有范围,真正的范围,似乎没有任何工作。

此外,在jquery回调函数中,我似乎无法重置父范围showMe作为scope.$parent.showMe = false。这可以防止我在显示内容时显示包含div,并在没有内容时隐藏它。

在附注中,最后一个问题是使用$last。在plunkr例子中,使用$ last是可能的,但在我的真实代码中,ng-repeat集合正在被HTTP响应拦截器填充。这似乎阻止使用$ last,因为所有元素都以$last = true结尾。是否有另一种方法来检测ng-repeat何时完成?

+0

我可以帮助设置父值。我在指令中有相同的问题设置值。 http://stackoverflow.com/questions/16494457/how-to-set-an-interpolated-value-in-angluar-directive – Anton 2013-05-15 04:00:11

回答

2

在你的指令,需要在scope.$apply()scope.$parent.showMe = false;

scope.$parent.showMe = true; //this one works 
element.hide().fadeIn('fast').delay(2000).fadeOut('slow', function(){ 
    scope.$apply(function(){ 
     scope.$parent.showMe = false; 
    }); 
}); 

这是因为你改变角度财产角(你的jQuery功能)外的值,所以角度不知道scope.showMe已经改变。

您的指令与您的ngRepeat标记相同,您不能使用隔离范围,因为它会移除您的ng-repeat="httpMessage in messages"的绑定。换句话说,如果您在此处将范围隔离,httpMessages将不存在。

0

我将隐藏/显示逻辑和ng-repeat向下移动到指令中,然后让控制器通过指令的属性向指令提供消息列表。

app.directive("hideShow", function() { 
return { 
    restrict: 'E', 
    template: 
    "<div ng:repeat='message in messages'>" + 
    " <em>{{message.message}}</em> " + 
    "</div>", 
    scope: { 
     messages: "=" 
    }, 
    link: function(scope, element, attrs) { 
     element.hide(); 
     scope.$watch("messages", function() { 
      element.fadeIn('fast').delay(1000).fadeOut('slow');    
     }); 
    } 
}; 
}); 

这是working Fiddle