2014-10-04 29 views
5

Bu soruyu daha önce sordum ama bir yanıt almadım. düzenlenebilir fonksiyonu doğru/yanlış geçiş gerekiyordu ve daha sonra bir düğmeye basıldığında düzenleme moduna geçmek olduğunuKnockout: Bağlama yapılamıyor

Uncaught ReferenceError: Unable to process binding "visible: function(){return !editable() }" 
Message: editable is not defined 

: Benim kodu çalıştırdığınızda

Bu hata mesajı alıyorum. Bu düğme html'de bir foreach aracılığıyla çağrılır, bu yüzden benim viewmodel'imle ilgili bir şey olduğunu tahmin ediyorum. GetJson'umdan elde ettiğim çıktı iyi çalışıyor ancak düzenlenebilir işlev çakışıyor. Burada

<div><ul data-bind="foreach: comments"> 
    <li class="ul3"> 
    <span class="author" data-bind="text: nickname, visible: !editable(), click: editComment"> 
    </span> 
    <input type="text" data-bind="value: nickname, visible: editable()"/>: 
    <div> 

    <span class="comment" data-bind="text: newMsg, visible: !editable(), click: editComment">  
    </span> 
    <textarea class="myComment" type="text" data-bind="value: newMsg, visible: editable()">      
    </textarea> 

    </div> 
    <button data-bind="click: editComment, text: editable() ? 'Save' : 'Edit comment'">   
    </button> 
    <button data-bind="click: deleteComment">Delete</button> 
      </li> 
     </ul> 
    </div> 

Ve javascript:

 function Comment() { 
    var self = this; 
    self.nickname = ko.observable(); 
    self.newMsg = ko.observable(); 
    self.editable = ko.observable(false); 

    self.sendEntry = function() { 
    vm.selectedComment(new Comment()); 

     if (self.newMsg() !== "" && self.nickname() !== "") { 

      $.post(writeUrl, "entry=" + ko.toJSON(self)); 
      self.newMsg(""); 
     } 
     vm.cSection().getNewEntries(); 
    }; 
    self.deleteComment = function() { 
     vm.comments.remove(self); 
    }; 

    self.editComment = function() { 
     self.editable(!self.editable()); 
    }; 
} 
function commentSection() { 
    var self = this; 
    self.timestamp = 0; 
    var entry; 
    self.getNewEntries = function() { 

     $.getJSON(readUrl, "timestamp=" + self.timestamp, function (comments) { 
      for (var i = 0; i < comments.length; i++) { 
       entry = comments[i]; 
       if (entry.timestamp > self.timestamp) { 
        self.timestamp = entry.timestamp; 
       } 
       vm.comments.unshift(entry); 
      } 
      self.getNewEntries(); 
     }); 
    }; 

} 

function ViewModel(){ 
    var self = this; 

    self.cSection=ko.observable(new commentSection()); 
    self.comments = ko.observableArray(); 
    self.selectedComment = ko.observable(new Comment()); 

    //self.cSection().getNewEntries(); 
} 
var vm=new ViewModel(); 
ko.applyBindings(vm); 
vm.cSection().getNewEntries(); 

}); 
+0

'Düzenlenebilir değil tanımlı bir kapsam sorunu gibi görünüyor. $ root.! editable() 'yi kullanmayı denediniz. Bir keman kurabilirseniz çok daha iyi olur –

+3

Lütfen kodunuzu yoğunlaştırın. Sorunu göstermek için üç satırlık HTML ve birkaç satırlık JavaScript yeterlidir; diğer geliştiricilere bir iyilik yapın ve onları mümkün olduğunca az önemsiz şeyler verin. Ayrıca, bir şeyleri çıkarırsanız, muhtemelen kendi hatalarınızı görene kadar daha net görmenizi sağlar. Bu gerçekten hata ayıklama 101. – Tomalak

cevap

4

şimdi iyi çalışıyor geçiş kodunuzdan bir şey yapılmadı

İşte benim html kodudur.

<input type="button" 
    data-bind="click: editComment, value:editable() ? 'Save' : 'Edit comment'" /> 

Görünüm Modeli:

bu Working Fiddle

Görünüm bulabilirsiniz sorunu devam ederse

$(document).ready(function() { 
    vm = function ViewModel() { 
     var self = this; 
     self.comments = ko.observableArray(); 
     function Comment() { 
      var self=this; 
      self.editable = ko.observable(false); 
      self.editComment = function() { 
       self.editable(!self.editable()); 
      }; 
     } 
     self.comments.push(new Comment()); 
    }; 
    ko.applyBindings(new vm); 
}); 

yukarıdaki keman faydalanmak ve inşa etmek deneyin senin İçinde kodu bilmeme izin ver.