2013-03-20 90 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