2014-12-15 5 views
5

Sto tentando di modificare la vista all'esterno dell'elemento ng-controller. Sono stato in grado di risolverlo usando $rootScope e manipolazioni dom, ma voglio sapere come può essere risolto da angularjs nativi?ng-controller esterno modello

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> 

J:

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

ecco esempio

+0

C'è un problema con il mantenimento del tag editing di ingresso all'interno del controllore ? – aa333

+0

Sapevi che puoi creare più ambiti nell'applicazione Angular, uno annidato all'interno di un altro? Quindi dai a ciascuno il proprio controller in modo da poter implementare questo "modo angolare". – Blazemonger

+0

Grazie. @Blazemonger puoi mostrare un esempio con più ambiti? – Webeith

risposta

0

modo più spigolose? Basta usare le direttive. Fondamentalmente, è possibile ottenere un controller (s) * di una direttiva padre all'interno di una direttiva figlio. Considera il controller principale come un'API per i suoi figli/figli.

.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); 
     }; 
    } 
    }; 
}) 

Ho aggiornato il vostro plnkr per voi: http://plnkr.co/edit/qRURHRMWt9K5acLWmCHv?p=preview

(*) È possibile passare più direttive come un array

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(); 
     } 
    }; 
})