2014-12-15 9 views
5

Próbuję edytować widok poza elementem ng-controller. Udało mi się go rozwiązać za pomocą $rootScope i manipulacji domem, ale chcę wiedzieć, jak można go rozwiązać dzięki natywnym angularjs?Kontroler zewnętrzny modelu ng

HTML:

<body> 
    <div class="container"> 
     <div class="block" ng-controller="BlockController as block"> 
      <div><strong>Name:</strong> {{ block.name }}</div> 
      <a href ng-click="block.edit()">Edit</a> 
     </div> 
    </div> 


    <div class="container-editor"> 
     <div id="block-editor"></div> 
    </div> 
    </body> 

JS:

angular.module('app', []) 

    .controller('BlockController', BlockController); 

    function BlockController($compile, $scope) 
    { 
     this.name = 'default name'; 

     this.edit = function() { 
      var $editor_html = ' <input type="text" ng-model="block.name" name="name" /> <a href ng-click="block.save()">Save</a>'; 

      $editor_html = $compile($editor_html)($scope); 
      angular.element(document.querySelector("#block-editor")).html('').append($editor_html); 
     }; 

     this.save = function() { 
      // save block 
      angular.element(document.querySelector("#block-editor")).html(''); 
     }; 

    } 

plnkr

tutaj jest Przykład

+0

Czy jest jakiś problem z utrzymaniem tag wejściowy edycji w kontrolerze ? – aa333

+0

Czy wiesz, że możesz utworzyć wiele zakresów w swojej aplikacji Angular, jedną zagnieżdżoną w drugiej? Następnie daj każdemu swój własny kontroler, abyś mógł zrealizować ten "kątowy sposób". – Blazemonger

+0

Dzięki. @Blazemonger możesz pokazać przykład z wieloma zakresami? – Webeith

Odpowiedz

0

bardziej kanciasty sposób? Wystarczy użyć dyrektyw. Zasadniczo można uzyskać kontroler (y) * dyrektywy nadrzędnej w dyrektywie podrzędnej. Traktuj kontroler nadrzędny jako interfejs API dla swojego dziecka/dzieci.

.directive('parent', function() { 
    return { 
    controller: function() { 
     this.catchChild = function(child) { 
      // code... 
     }; 
    } 
    }; 
}) 
.directive('child', function() { 
    return { 
    require: '^parent', 
    link: function($scope, $element, $attrs, parentController) { 
     $scope.jump = function() { 
     // I'm jumping... 
     parentController.catch($scope); 
     }; 
    } 
    }; 
}) 

zaktualizowałem swoją plnkr dla Ciebie: http://plnkr.co/edit/qRURHRMWt9K5acLWmCHv?p=preview

(*) można przekazać wiele dyrektyw jako tablica

angular.module('app', []) 
.directive('parent1', function() { 
    return { 
     controller: function() { 
      this.fn1 = function(child) { 
       // code... 
      }; 
     } 
    }; 
}) 
.directive('parent2', function() { 
    return { 
     controller: function() { 
      this.fn2 = function(child) { 
       // code... 
      }; 
     } 
    }; 
}) 
.directive('child', function() { 
    return { 
     require: ['^parent1', '^parent2'], 
     link: function($scope, $element, $attrs, controllers) { 
      var parent1Controller = controllers[0]; 
      var parent2Controller = controllers[1]; 
      parent1Controller.fn1(); 
      parent2Controller.fn2(); 
     } 
    }; 
}) 
Powiązane problemy