2014-12-15 6 views
5

Ich versuche, Ansicht außerhalb ng-controller Element zu bearbeiten. Ich konnte es lösen, indem ich $rootScope und dom Manipulationen benutze, aber ich möchte wissen, wie es durch native angularjs gelöst werden kann?ng-Modell außerhalb Controller

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

hier Beispiel ist

+0

Gibt es ein Problem, die Bearbeitung Input-Tag in der Steuerung mit dem Halten ? – aa333

+0

Wussten Sie, dass Sie in Ihrer Angular-Anwendung mehrere Bereiche erstellen können, einer innerhalb eines anderen? Dann geben Sie jedem einen eigenen Controller, damit Sie diesen "Winkelweg" implementieren können. – Blazemonger

+0

Danke. @Blazemonger kannst du ein Beispiel mit mehreren Bereichen zeigen? – Webeith

Antwort

0

kantige Art und Weise? Verwenden Sie einfach die Direktiven. Grundsätzlich können Sie einen Controller (s) * einer Eltern-Direktive in einer Kind-Direktive finden. Behandeln Sie den übergeordneten Controller als API für seine untergeordneten Elemente.

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

ich Ihre plnkr für Sie aktualisiert: http://plnkr.co/edit/qRURHRMWt9K5acLWmCHv?p=preview

(*) Sie können mehrere Richtlinien als Array übergeben können

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