2014-02-13 76 views
2

我正在使用來自用於AngularJS的xeditable模塊的editable-text指令。有沒有辦法禁用整個頁面的指令?AngularJS禁用指令

我想過使用替換可編輯文本{{variable}},其中variable="editable-text"啓用和variable="somethingElse"禁用。但是,這會在html中產生無意義的屬性。

+0

一個例子是有一個原因,你不能對指令代碼的網頁控制器,採用NG-隱藏=「booleanVar」上的範圍變量,然後切換到booleanVar顯示或隱藏? – edzillion

回答

8

可以使用其他指令刪除指令。爲此,新指令應該比被刪除的指令具有更高的優先級,然後在編譯狀態下搜索帶有所需指令的元素並將tag/class /元素一起移除。這裏是一個非常簡單的實現這一點:

.directive("disableDirective", function() { 
    function compile (el, attr) { 
     var hasDirective = el[0].querySelectorAll("["+attr.disableDirective+"]"); 

     [].forEach.call(hasDirective, function (el) { 
      el.removeAttribute(attr.disableDirective); 
     }); 
    } 

    return { 
     priority: 100000, 
     compile: compile 
    }; 
}) 

以下HTML DIV將是可見的,這要歸功於我們的指令:

<body disable-directive="ng-hide"> 
    <div ng-hide="true">Hidden</div> 
</body> 

你必須設置disable-directive="editable-text"的頁面。

JSBin

+0

它不適用於動態創建的節點。 http://jsfiddle.net/dizel3d/cxvxapme/ – dizel3d

+0

如果您找到解決方案,請不要猶豫,將其作爲另一個答案發布。我沒有聲稱它會處理所有可以想象到的情況。 –

+0

我還沒有解決。 – dizel3d

2

如果你只是想永遠關閉所有應用該指令,我知道有兩種方式:

  1. 這個指令創建裝飾,只是設置compile功能空函數例如到angular.noop。檢查這些東西的更多信息:https://docs.angularjs.org/api/auto/service/$provide#decorator。或者您也可以使用相同的名稱和限制(A | E | C | M)創建指令,但具有更高的優先級並且terminal屬性設置爲true。但是你應該時刻記住,這個指令將會關閉同一個元素上所有低優先級的指令。 (所以這個解決方案看起來像我反模式)

+0

謝謝,這真的很有幫助。以下是此答案的示例/代碼http://pastebin.com/raw/mHEn1s9D –

0

我相信你可以使用裝飾器刪除restrict字段。這將禁用該指令。下面是使用NG-顯示

var app = angular.module("app", []); 

//disable ng-show 
app.config(function($provide) { 
    $provide.decorator('ngShowDirective', function($delegate) { 
    var directive = $delegate[0]; 

    directive.restrict = ""; 
    return $delegate; 
    }); 
});