2016-10-28 67 views
0

使用多個控制器是否正確?如何在一個指令angularjs中使用多個控制器?

<div ng-if="actionButtonText=='Confirm'" ng-controller="upsrCtrl" ng-controller="pt3Ctrl" ng-controller="spmCtrl"> 
    <button ng-click="checkAnswer()" class="button button-confirm-outline"> 
     {{actionButtonText}} 
    </button> 
</div> 

我用這些的原因是我有這樣的頁腳和動態基於不同的控制器上的內容變化。

+0

是什麼讓你想要這樣的設計?你只有一個範圍函數checkAnswers(),爲什麼你需要三個控制器來處理這個 –

+0

頭 - >內容(動態變化) - >頁腳 – Nere

+0

頁眉和頁腳不需要改變,只有內容會改變。內容得到了不同的控制器 – Nere

回答

0

嘗試使用下面的自定義指令。採取一個plunker一看: https://plnkr.co/edit/ileyNcaSlJYLc2bCbJeq?p=preview

app.directive('ifController', function factory($compile) { 
    var handler = { 
    restrict: 'A', 
    scope: { 
     ifController: '@' 
    }, 
    link: function(scope, element, attrs){ 
     var lastElement = null; 
     var update = function() { 
     if (lastElement !== null) { 
      lastElement.remove(); 
     } 
     var template = '<div ng-controller="' + scope.ifController + '">'+ 
       '<button ng-click="checkAnswer()" class="button button-confirm-outline">'+ 
       '{{actionButtonText}}'+ 
       '</button>' + 
       '</div>'; 
      var linkFn = $compile(template); 
      var content = linkFn(scope); 
      element.append(content); 
      lastElement = content; 
     } 
     scope.$watch('ifController', update); 
     } 
    }; 
    return handler; 
}); 

你可以通過一個變量如果-位指示像下面設置控制器:

<div if-controller="{{controller}}"> 

這將刪除元素的以前的版本,並重新編譯一個用一個新的控制器。你也可以修改這個指令來把它用作你使用的另一個指令的包裝(只是改變模板)。

+0

我先試試..我會過來,並在以後提供反饋..感謝您的答案。 – Nere

+0

沒有工作.... – Nere

+0

請檢查更新的答案。這是完全不同的。希望這個會有所幫助。 –

0

我假設你的ng-if處理使用ng控制器的開關。 ng-click是觸發交換機的事件。如果是這種情況,只渲染所有3塊只顯示基於parentCtrl。

<div ng-controller="parentCtrl"> 
    <div ng-if="parentCtrl.actionButtonText=='upsrCtrl'" ng-controller="upsrCtrl"> 
     <button ng-click="checkAnswer()" class="button button-confirm-outline"> 
      {{actionButtonText}} 
     </button> 
    </div> 
    <div ng-if="parentCtrl.actionButtonText=='pt3Ctrl'" ng-controller="pt3Ctrl"> 
     <button ng-click="checkAnswer()" class="button button-confirm-outline"> 
      {{actionButtonText}} 
     </button> 
    </div> 
    <div ng-if="parentCtrl.actionButtonText=='spmCtrl'" ng-controller="spmCtrl"> 
     <button ng-click="checkAnswer()" class="button button-confirm-outline"> 
      {{actionButtonText}} 
     </button> 
    </div> 
</div> 
+0

我需要設置新的'parentCtrl'?或者只是使用代碼... – Nere

+0

必須設置父控制器。或在指令之間共享服務。我只會使用父控制器 –

0

提供控制器的包裝可能是一種找到您的解決方案的方法。但是如果你在元素級別看到它,An元素不能攜帶多於一個的控制器。

正如我所看到的有一種方法使一個控制器作爲主控制器,並通過另一個控制器作爲一些其他參數。像vm我在波紋管例子中使用。這裏vm是頁面級別控制器實例(元素存在的頁面的控制器)。使用Isolated scope這裏訪問vm

<div ng-if="actionButtonText=='Confirm'" ng-controller="upsrCtrl"> 
    <button ng-click="checkAnswer()" class="button button-confirm-outline" vm='vm'> 
    {{actionButtonText}} 
    </button> 
    </div> 

但更好的辦法,我會建議是與它的獨立的控制器使用一個以上的指令,並使用它。這將是某種屬性級別指令。這將使你的目的解決。

app.directive('dirUp', function() { 
    return { 
    controller: function(scope) { 
    //directive controller 
    } 
    }; 
}); 

app.directive('dirDown', function() { 
return { 
    controller: function(scope) { 
    //directive controller 
     } 
     }; 
    }); 

和HTML

<div dir-up use-down></div> 

希望它會幫助你。

+0

我不明白。 – Nere

+0

使用多個指令,爲它的每個功能使用單獨的指令。 – Viplock

+0

稍後我會提供反饋。感謝您的回答。 – Nere

相關問題