2013-11-20 11 views
21

मेरा लक्ष्य एक editable निर्देश एक उपयोगकर्ता जो करने के लिए विशेषता जुड़ा हुआ है किसी भी तत्व का HTML संपादित करने की अनुमति देता है कि बनाने के लिए है (Plunker देखें: http://plnkr.co/edit/nIrr9Lu0PZN2PdnhQOC6)कोणीय निर्देश के भीतर मूल transcluded सामग्री प्राप्त करें

यह लगभग को छोड़कर काम करता है मुझे पाठ क्षेत्र को प्रारंभ करने के लिए स्थानांतरित सामग्री का मूल कच्चा HTML नहीं मिल सकता है। मैं इसे clone.text() से टेक्स्ट प्राप्त कर सकता हूं, लेकिन इसमें <H1>, <div> इत्यादि जैसे एचटीएमएल टैग गायब हैं, इसलिए कोई संपादन के साथ आवेदन पर क्लिक करना बेवकूफ नहीं है।

विधि clone.html() एक त्रुटि फेंकता है, Cannot read property 'childNodes' of undefined

app.directive("editable", function($rootScope) { 
    return { 
    restrict: "A", 
    templateUrl: "mytemplate.html", 
    transclude: true, 
    scope: { 
     content: "=editContent" 
    }, 

    controller: function($scope, $element, $compile, $transclude, $sce) { 

     // Initialize the text area with the original transcluded HTML... 
     $transclude(function(clone, scope) { 

     // This almost works but strips out tags like <h1>, <div>, etc. 
     // $scope.editContent = clone.text().trim(); 

     // this works much better per @Emmentaler, tho contains expanded HTML 
     var html = ""; 
     for (var i=0; i<clone.length; i++) { 
      html += clone[i].outerHTML||'';} 
     }); 
     $scope.editContent = html; 

     $scope.onEdit = function() { 
     // HACK? Using jQuery to place compiled content 
     $(".editable-output",$element).html(
      // compiling is necessary to render nested directives 
      $compile($scope.editContent)($rootScope) 
     ); 
     } 

     $scope.showEditor = false; 

     $scope.toggleEditor = function() { 
     $scope.showEditor = !$scope.showEditor; 
     }   
    } 
    } 
}); 

(यह सवाल अनिवार्य रूप से, पहले के एक सवाल फ्रेम करने के लिए प्रयास के बाद सवाल और कोड की एक थोक पुनर्लेखन है Get original transcluded content in Angular directive)

+2

'क्लोन' तत्वों का संग्रह है। क्या आप इसे डीबगर में देख सकते हैं? –

+0

आह! उन पर इटरेट करना और बाहरी HTML जोड़ना बहुत करीब है: 'var text = ""; के लिए (var i = 0; i 'के बजाय यह'

Clock

{{time}}

'दिखाता है। इस उदाहरण में, घड़ी सामग्री को स्थानांतरित नहीं करती है, इसलिए शुद्ध प्रभाव समान होता है। मुझे आश्चर्य है कि मूल HTML प्राप्त करना संभव है? – prototype

+1

मुझे संदेह था कि यह मामला हो सकता है। अच्छा सौदा। मूल HTML बाहरी दायरे में $ तत्व ऑब्जेक्ट में बैठा हो सकता है। परिवर्तन मेरा मजबूत सूट नहीं है। –

उत्तर

3

$element.innerHTML चाहिए मूल HTML शामिल है। मैं दिखा रहा हूं कि इसमें

<div class="editable"> 
    <span class="glyphicon glyphicon-edit" ng-click="toggleEditor()"></span> 

    <div class="editable-input" ng-show="showEditor"> 
     <b><p>Enter well-formed HTML content:</p></b> 
     <p>E.g.<code>&lt;h1&gt;Hello&lt;/h1&gt;&lt;p&gt;some text&lt;/p&gt;&lt;clock&gt;&lt;/clock&gt;</code></p> 
     <textarea ng-model="editContent"></textarea> 
     <button class="btn btn-primary" ng-click="onEdit()">apply</button> 
    </div> 

    <div class="editable-output" ng-transclude=""></div> 
    </div> 
+3

बहुत उपयोगी। इसमें टेम्पलेट टेक्स्ट है। आपके उत्तर ने मुझे 'compile (element, attrs)' विधि जोड़ने के लिए स्पार्क किया था, जिसमें इसके 'आंतरिक HTML' में स्थानांतरित HTML है। लेकिन एंगुलर ने टेम्पलेट का उपयोग करके इसे नए डीओएम तत्वों में विस्तारित करने के बाद किया है। यदि कोई उप-तत्व 'प्रतिस्थापन: सत्य' है या सामग्री को स्वयं स्थानांतरित कर देता है तो वह टूट जाएगा। मुझे संदेह है कि एंगुलर को एंगुलर संसाधित करने से पहले एचटीएमएल देने के लिए कोई रास्ता नहीं है, और इस प्रकार प्रारंभिक सामग्री को ट्रांसक्यूलेशन के माध्यम से बूटस्ट्रैप नहीं किया जाना चाहिए, लेकिन एक विशेषता या AJAX के माध्यम से कहें। – prototype

+0

यह पाचन चक्र के झटके में आता है। मनमाने ढंग से उच्च प्राथमिकता निर्धारित करके, आप यह सुनिश्चित करने में सक्षम हो सकते हैं कि इसका मूल्यांकन पहले किया जाए। –

+0

अगर मैं 'प्रतिस्थापन: सत्य' का उपयोग टेम्पलेट के साथ कर रहा हूं तो एक कोणीय निर्देश की असम्पीडित सामग्री को कैसे प्राप्त करें। इसका मतलब है 'तत्व' में कच्ची मूल सामग्री नहीं है 'तत्व' टेम्पलेट तत्व मूल तत्व नहीं है –

संबंधित मुद्दे