2016-11-28 1 views
-1

다음은 게시물 및 주석 기능이 포함 된 코드입니다. 나는 data-bind="click: addComment"data-bind="click: addPost"과 같은 ul 태그 클릭 이벤트 내에서 뷰를 바인딩하고 있습니다. 괜찮 았어.모델 내의 녹아웃 js 클릭 이벤트

제 생각에는 data-bind="click: addComment"을 다른보기에 넣으면 작동하지 않습니다. 내 data-bind="click: addComment"을 다른보기로 유지해야하며 게시물 모델 내부에 self.addComment을 사용해야합니다. 누군가 도움을받을 수 있습니까?

<div class="publishContainer"> 
<textarea class="msgTextArea" id="txtMessage" data-bind="value: newMessage, jqAutoresize: {}" style="height:3em;" placeholder="What's on your mind?"> </textarea> 
<input type="button" data-url="/Wall/SavePost" value="Share" id="btnShare" data-bind="click: addPost"> 
</div> 
<ul id="msgHolder" data-bind="foreach: posts"> 
<li class="postHolder"> 
    <img data-bind="attr: { src: PostedByAvatar }"><p><a data-bind="text: PostedByName"></a>: <span data-bind=" html: Message"></span></p> 
    <div class="postFooter"> 
     <span class="timeago" data-bind="text: PostedDate"></span>&nbsp;<a class="linkComment" href="#" data-bind=" click: toggleComment">Comment</a> 
     <div class="commentSection"> 
      <ul data-bind="foreach: PostComments"> 
       <li class="commentHolder"> 
        <img data-bind="attr: { src: CommentedByAvatar }"><p><a data-bind="text: CommentedByName"></a>: <span data-bind=" html: Message"></span></p> 
        <div class="commentFooter"> <span class="timeago" data-bind="text: CommentedDate"></span>&nbsp;</div> 
       </li> 
      </ul> 
      <div style="display: block" class="publishComment"> 
       <textarea class="commentTextArea" data-bind="value: newCommentMessage, jqAutoresize: {}" placeholder="write a comment..."></textarea> 
       <input type="button" value="Comment" class="btnComment" data-bind="click: addComment"/> 
      </div> 
     </div> 
    </div> 
</li> 
</ul> 
</div> 

//second view// 
<div class="publishContainer"> 
    <input type="button" value="Comment" class="btnComment" data-bind="click: addComment"/> 
<div> 

그리고 JS는 :

문제에
//Post Model 
function Post(data) { 
    var self = this; 
    data = data || {}; 
    self.PostId = data.PostId; 
    self.Message = ko.observable(data.Message || ""); 
    self.PostedBy = data.PostedBy || ""; 
    self.PostedByName = data.PostedByName || ""; 
    self.PostedByAvatar = data.PostedByAvatar || ""; 
    self.PostedDate = getTimeAgo(data.PostedDate); 
    self.error = ko.observable(); 
    self.PostComments = ko.observableArray(); 

    self.newCommentMessage = ko.observable(); 
    self.addComment = function() { 
    var comment = new Comment(); 
    comment.PostId = self.PostId; 
    comment.Message(self.newCommentMessage()); 
    return $.ajax({ 
     url: commentApiUrl, 
     dataType: "json", 
     contentType: "application/json", 
     cache: false, 
     type: 'POST', 
     data: ko.toJSON(comment) 
    }) 
    .done(function (result) { 
     self.PostComments.push(new Comment(result)); 
     self.newCommentMessage(''); 
    }) 
    .fail(function() { 
     error('unable to add post'); 
    }); 
    } 
    if (data.PostComments) { 
    var mappedPosts = $.map(data.PostComments, function (item) { return new Comment(item); }); 
    self.PostComments(mappedPosts); 
    } 
    self.toggleComment = function (item,event) {  
    $(event.target).next().find('.publishComment').toggle(); 
    } 
} 

// Comment Model: 

function Comment(data) { 
    var self = this; 
    data = data || {}; 
    self.CommentId = data.CommentId; 
    self.PostId = data.PostId; 
    self.Message = ko.observable(data.Message || ""); 
    self.CommentedBy = data.CommentedBy || ""; 
    self.CommentedByAvatar = data.CommentedByAvatar || ""; 
    self.CommentedByName = data.CommentedByName || ""; 
    self.CommentedDate = getTimeAgo(data.CommentedDate); 
    self.error = ko.observable();  
} 

function viewModel() { 
    var self = this; 
    self.posts = ko.observableArray(); 
    self.newMessage = ko.observable(); 
    self.error = ko.observable(); 
    self.loadPosts = function() { 
    //To load existing posts 
    $.ajax({ 
     url: postApiUrl, 
     dataType: "json", 
     contentType: "application/json", 
     cache: false, 
     type: 'GET' 
    }) 
     .done(function (data) { 
      var mappedPosts = $.map(data, function (item) { return new Post(item); }); 
      self.posts(mappedPosts); 
     }) 
     .fail(function() { 
      error('unable to load posts'); 
     }); 
    } 

    self.addPost = function() { 
    var post = new Post(); 
    post.Message(self.newMessage()); 
    return $.ajax({ 
     url: postApiUrl, 
     dataType: "json", 
     contentType: "application/json", 
     cache: false, 
     type: 'POST', 
     data: ko.toJSON(post) 
    }) 
    .done(function (result) {   
     self.posts.splice(0,0,new Post(result)); 
     self.newMessage(''); 
    }) 
    .fail(function() { 
      error('unable to add post'); 
    }); 
} 
self.loadPosts(); 
return self; 
}; 

ko.applyBindings(new viewModel(),documentgetElementByClassName(publishContainer)); 
+0

아래 그림과 같이 소위 첫 번째보기에, 추가 설명 부분을 업데이트하고있는 경우 BTW 당신은 ​​documentgetElementByClassName' – gkb

+0

'에서''후 .' document' 누락 'posts' 밖에서'addComment'에 접근하기를 원한다면'Post' 클래스에서 빠져 나가야합니다. – Thaadikkaaran

+0

클래스에서 click 이벤트를 사용할 수 없으므로 ko.applybindings에서 동일한 클래스 이름을 사용하고 있습니다. –

답변

0

하나의 옵션은 selectedPost/currentPost을 유지하는 observable 이 있어야한다는 것입니다. 이 소품은 당신이 전에 Add Comment를 눌러야합니다.

다음과 같이 viewModel을 업데이트하십시오.

function viewModel() { 
    var self = this; 
    self.posts = ko.observableArray(); 
    self.newMessage = ko.observable(); 
    self.error = ko.observable(); 
    self.loadPosts = function() { 
     //To load existing posts 
     $.ajax({ 
       url: postApiUrl, 
       dataType: "json", 
       contentType: "application/json", 
       cache: false, 
       type: 'GET' 
      }) 
      .done(function(data) { 
       var mappedPosts = $.map(data, function(item) { 
        return new Post(item); 
       }); 
       self.posts(mappedPosts); 
      }) 
      .fail(function() { 
       error('unable to load posts'); 
      }); 
    } 

    self.addPost = function() { 
     var post = new Post(); 
     post.Message(self.newMessage()); 
     return $.ajax({ 
       url: postApiUrl, 
       dataType: "json", 
       contentType: "application/json", 
       cache: false, 
       type: 'POST', 
       data: ko.toJSON(post) 
      }) 
      .done(function(result) { 
       self.posts.splice(0, 0, new Post(result)); 
       self.newMessage(''); 
      }) 
      .fail(function() { 
       error('unable to add post'); 
      }); 
    } 

    self.selectedPost = ko.observable(); // You have to update this property, before you click on Add Comment from second view. 

    self.addComment = function() { 
     var comment = new Comment(); 
     comment.PostId = self.selectedPost.PostId; 
     comment.Message(self.newCommentMessage()); 
     return $.ajax({ 
       url: commentApiUrl, 
       dataType: "json", 
       contentType: "application/json", 
       cache: false, 
       type: 'POST', 
       data: ko.toJSON(comment) 
      }) 
      .done(function(result) { 
       self.selectedPost.PostComments.push(new Comment(result)); 
       self.newCommentMessage(''); 
      }) 
      .fail(function() { 
       error('unable to add post'); 
      }); 
    } 

    self.loadPosts(); 
    return self; 
}; 

그리고,

<div style="display: block" class="publishComment"> 
       <textarea class="commentTextArea" data-bind="value: newCommentMessage, jqAutoresize: {}" placeholder="write a comment..."></textarea> 
       <input type="button" value="Comment" class="btnComment" data-bind="click: $parent.addComment"/> 
      </div> 
+0

@ 감사합니다. postID를 받고 api에 값을 보내고 있지만 suceess에서는 모든 객체를 보유하고있는 PostComments 변수를 사용합니다. arrary, loadpost 내 모든 "post 메서드"를 사용하여 같은 foreach 루프에서 사용할 수있는 방법을 사용하는 경우 모든 데이터 게시물 및 주석 및 매핑보기를 사용하여 foreach "PostComments", 지금은 다른 방법을 사용하여 내 "가져 오기 방법"내 get 메서드 –

+0

너를 못 느끼 겠어. 지금 당신의 문제는 무엇입니까? – Thaadikkaaran

+0

먼저 self.loadPosts 메서드를 호출합니다. 모든 게시물을 얻고 sel.loadPost의 성공에 대한 설명을 추가합니다. 모델에 게시 할 데이터를 전달하고 있습니다. 데이터가 주석인지 게시인지 확인하고, 조건을 확인하고, 코멘트 (예 : add Comment)에 전달, 지금은 addComment를 클릭합니다. 특정 게시물에 코멘트를 추가해야하지만, 코멘트 바인딩을 위해 Foreachloop에서 이미 PostComments 변수를 사용하고있는 경우, 지금 if (data.PostComments) {return new Comment (item)}}}} addComment click 이벤트를 viewModel에서 추가 할 수 없습니다. 이전에 foreach 루프에서 사용했던 PostComments 변수입니다. 새 변수 –