2012-07-31 18 views
9

Avviso: newbie angolare avanti.Direttiva personalizzata AngularJS ng-show/ng-hide

Sto provando a creare un widget personalizzato che mostrerà per impostazione predefinita un collegamento "Rispondi" e, quando si fa clic, dovrebbe essere nascosto e una textarea dovrebbe essere mostrata. Ecco cosa ho finora, ma non funziona:

.directive('replybox', function ($rootScope) { 
    var linkFn = function (scope, element, attrs) { 
     var label = angular.element(element.children()[0]); 
     scope.showInput = false; 

     label.bind("click", textbox); 

     function textbox() { 
      scope.showInput = true; 
     } 
    }; 
    return { 
     link:linkFn, 
     restrict:'E', 
     scope:{ 
      id:'@', 
      label:'@', 
      showInput:'=' 
     }, 
     template:'<a ng-hide="showInput">label</a><textarea ng-show="showInput"> </textarea>', 
     transclude:true 
    }; 
}) 

Qualsiasi linea guida sarà apprezzata. Grazie!

risposta

16

Matias, ecco una jsFiddle di lavoro: http://jsfiddle.net/pkozlowski_opensource/Z6RzD/

C'erano certo numero di cose in corso in realtà, ma penso che il più importante è stato il fatto che è necessario utilizzare Ambito $ applicare ad avere preavviso angolare. i cambiamenti di scopo da "fuori dal mondo anulare". Per impostazione predefinita angolare non fa scattare i modelli rivalutazione su ogni evento DOM quindi è necessario avvolgerlo in applica:

scope.$apply('showInput = true'); 

Maggiori informazioni qui: http://docs.angularjs.org/api/ng . $ rootScope.Scope

ci sono anche altri elementi degni di nota nel tuo esempio:

  • Credo che si vorrebbe essere in grado di passare 'label' come un attributo alla direttiva e quindi utilizzarlo in il tuo modello - se è così è necessario utilizzare l'espressione {{label}}
  • Non ero sicuro di quale sarebbe stato l'uso per l'attributo 'id' così l'ho omesso dal mio violino
  • Lo stesso per "showInput" - non riuscivo a capire quale sia la cosa che stai cercando di ottenere
+0

Posso chiedere un esempio completo? – honzajde

+0

@ user271996 C'è un jsFiddle con un esempio completo allegato alla risposta. Ti manca ancora qualcosa? –

+0

Probabilmente è possibile associare la funzione di clic dell'etichetta tramite ng-clic nel modello invece di collegarlo manualmente nella funzione di collegamento. –

0

si ca anche usare $ timeout per notificare angolare delle modifiche come ad esempio

.directive('replybox', function($rootScope, $timeout) { 
    var linkFn = function(scope, element, attrs) { 
    var label = angular.element(element.children()[0]); 
    scope.showInput = false; 

    label.bind("click", textbox); 

    function textbox() { 
    $timeout(function() { 
     scope.showInput = true; 
    }); 

    } 
}; 
return { 
    link: linkFn, 
    restrict: 'E', 
    scope: { 
    id: '@', 
    label: '@', 
    showInput: '=' 
    }, 
    template: '<a ng-hide="showInput">label</a><textarea ng-show="showInput"> </textarea>', 
    transclude: true 
}; 
}); 
Problemi correlati