0

插入時不會被重新編譯下面是這證明了標題所述問題的例子:https://plnkr.co/edit/Xn1qgYftc5YHMsrGj0sh?p=preview指令NG-如果DOM

指令代碼:

.directive('translate', function($compile) { 
    return { 
    compile: function(element) { 
     var html = element.html().split('<br plural="">'); 
     return function(scope, element, attrs) { 
     function c(h) { 
      element.html(h); 
      $compile(element.contents())(scope); 
     } 
     if (attrs.translate != '') { 
      scope.$watch(function() { 
      return scope.$eval(attrs.translate) 
      }, function(val, oldval) { 
      if (val == oldval && html[2] !== undefined) return; 
      var p = html[2]; 
      html[2] = gettext(html[0], html[1], attrs.add !== undefined ? val + attrs.add : attrs.subtract !== undefined ? val - attrs.subtract : val); 
      if (p != html[2]) c(html[2]); 
      }); 
     } else c(gettext(html[0])); 
     } 
    } 
    } 
}) 

所以問題是當我切換回指令以顯示ng-if - 它可能不會被重新編譯(?)完全重置,因此它會導致錯誤行爲。
如何跟蹤何時插入指令並將其從DOM中刪除?如果有辦法,我可以用指標解決這個問題。但是一定有更好的辦法,對吧?

+0

你可以使用ng-show嗎? – mikelt21

+0

@ mikelt21:在某些情況下,我想優化並使用'ng-if',而不是像許多不同的選擇一樣只能一次顯示一個,所以這不是解決方案。它沿着'ng-show'出現在那裏。 – MikiSoft

回答

0

解決這樣的:

.directive('translate', function($compile) { 
    return { 
    compile: function(element, attrs) { 
     if (attrs.translate == '') { 
     element.html(gettext(element.html())); 
     return; 
     } 
     attrs.html = element.html().split('<br plural="">'); 
     return { 
     post: function (scope, element, attrs) { 
      delete attrs.html[2]; 
      scope.$watch(function() { 
      return scope.$eval(attrs.translate); 
      }, function (val) { 
      var p = attrs.html[2]; 
      attrs.html[2] = gettext(attrs.html[0], attrs.html[1], attrs.add !== undefined ? val + attrs.add : attrs.subtract !== undefined ? val - attrs.subtract : val); 
      if (p == attrs.html[2]) return; 
      element.html(attrs.html[2]); 
      $compile(element.contents())(scope); 
      }); 
     } 
     } 
    } 
    } 
}) 

Live example

我想我已經優化的不夠好,但隨時更正代碼。

+0

也可以與你的原代碼一起工作,如果你把'compile:function ...'改成'link:function ...' – mikelt21

+0

@ mikelt21:我沒有看到那是怎麼工作的。在我的指令中再次看到'compile',它會返回'pre'和'post'鏈接函數,並在此之前保存未處理的HTML代碼。 'link'功能無法實現。 – MikiSoft

+0

啊沒關係,我沒有仔細查看你的代碼,也沒有解釋代碼應該做什麼。這是我想要得到的:[鏈接](https://plnkr.co/edit/kYuf4iSPOuTxNGXVziEn?p=preview)。爲了避免重複的html代碼,我也改變了一點html結構。 – mikelt21