2014-10-17 92 views
2

我遇到了衝突指令和屬性名稱的問題。這是我的問題的一個簡化版本:有兩個指令,其中第一個指令的名稱是第二個指令的屬性名稱:指令名稱和屬性名稱衝突

angular.module('mymodule').directive('property', function() { 
    return { 
     template: '<div>Property Directive</div>' 
    }; 
}); 

angular.module('mymodule').directive('fail', function() { 
    return { 
     scope: { 
      property: '=' 
     }, 
     template: '<div>{{property}}</div>' 
    } 
}); 

當我嘗試我的第二個指令添加到一個HTML文件:

<fail property="'test'"></fail> 

我得到以下錯誤:

Error: [$compile:multidir] Multiple directives [fail, property] asking for template on: <fail property="'test'">http://errors.angularjs.org/1.3.0-rc.4/$compile/multidir?p0=fail&p1=property&p2=template&p3=%3Cfail%20property%3D%22'test'%22%3E 

現在,這不會是一個問題,如果這兩個指令是在我的模塊,因爲他們重新命名很容易。但是我在我的應用程序中使用了來自不同外部模塊的指令/屬性名稱。

我該如何判斷角度,property這個屬性在這個特殊情況下是不是指令?

+0

也許你可以裝飾這些指令2,改變他們的限制,以不同的呢?或者將他們的優先級改爲不同,使得終端選項的指令失敗優先級更高? – PSL 2014-10-17 01:50:59

+0

http://plnkr.co/edit/5Cfn5T?p=preview根據這些指令的作用,您可以更改限制值。 – PSL 2014-10-17 01:59:48

+0

感謝您的幫助和示例代碼。我仍然試圖解決這個問題,因爲改變其他模塊的指令會產生一些副作用。我對Angular很陌生,我覺得我缺少重要的一點。在我看來,像很多人應該遇到這種類型的指令和屬性名稱衝突的問題... 你知道重命名(或添加前綴)從其他模塊的指令名稱嗎? – forrert 2014-10-21 17:54:09

回答

2

只是擴展我的評論來回答,而不是重新命名的方式,我可以想到的方式是創建一個相同的指令和無效現有的指令。這樣你可以有一個適當的命名約定命名爲的指令,你正在使用另一個模塊。在這裏,你需要

  • $compileProvider

    • 要註冊一個新的指令,覆蓋角度指令構造app.directive
  • $provide service

    • 爲了裝飾用可憐的名字指令,得到它的定義,並返回只是一個空白無操作的工廠。
    • 您可以用Directive關鍵字修飾指令後綴。他們也被註冊爲工廠。

你需要確保這個配置,有針對性的指令登記後顯得尤爲裝飾部。

app.config(['$compileProvider', function ($compileProvider) { 
    //Override directive constructor 
    app.directive = function (name, dirObject) { 
     //Register a directive 
     $compileProvider.directive(name, function() { 
      return dirObject[0]; 
     }); 
    }; 
}]).config(['$provide', function($provide){ 
    //Decorate target directive 
    $provide.decorator('propertyDirective', ['$delegate', function($delegate){ 
     //Just register a new directive with source's definition 
     app.directive('cmProperty', $delegate); 
     //return a no operation factory as directive constructor, to make it inactive 
     return function() { return angular.noop }; 
    }]); 
}]); 

Demo

你可以通過放置在一個恆定的目標指令的名稱和運行裝飾的循環自動前綴/重命名(與另一名重建),它自動執行此。


更新

看到一個generic solution in my repository

+0

當兩個指令具有相同的名稱時,這會起作用嗎? – 2015-10-14 09:53:49

+1

@przemo_li當你有兩個具有相同名稱的指令時,工廠是加法的,這意味着當指令被使用時,它將按照優先級的順序渲染指令編譯,你也不能有2個不同的模板等等。當然,這將是特別的目的和故意創造的。例如ng-required指令和其他角度框架中的其他指令。希望這可以幫助! – PSL 2015-10-15 16:47:54

+0

PSL - 如果你仍然在關注這個問題,你可能會看看我在這個問題上的代碼實現嗎? http://stackoverflow.com/questions/36049473/renaming-3rd-party-angular-directive-using-provide-not-working?noredirect=1#comment59837412_36049473 – jonhobbs 2016-03-19 13:22:45