1

Я создаю персональный сайт, используя durandal и knockout с приведенным ниже кодом, чтобы связать редактирующую страницу блога. Все отлично работало, и я смог связать текстовую область с возвращенным текстом вызова ajax.long ajax call break knockout binding

После того, как это было сделано, мне было интересно, если длинный ответ от веб-сервиса будет разорвать его, так что я положил в Thread.sleep (1000) на службу, и теперь я не могу получить его, чтобы связать возвращаемый текст текстовой области. Любые предложения о том, как заставить это работать ???

бок примечание: Я не думаю, что это имеет отношение к рамках Дюрандаль, но я думал, что будет включать в себя, что я его

Javascript

define(['services/logger', 'services/wysiwyg'], function (logger, wysiwyg) { 

var postObservable = ko.mapping.fromJS({}); 
var vm = { 
    activate: activate, 
    post: postObservable, 
}; 
return vm; 

function activate(routeData) { 
    var id = routeData.id; 
    $.ajax(
     { 
      type: "GET", 
      url: '/api/blog/get', 
      data: { id: id }, 
      dataType: "json", 
     }) 
    .then(function(data){ 
     ko.mapping.fromJS(data, postObservable); 
    }); 

    } 

}); 

C#

public class BlogController : ApiController 
    { 
     public IBlogRepository _blogRepository; 
     public BlogController(IBlogRepository blogRepository) 
     { 
      _blogRepository = blogRepository; 
     } 

     public BlogModel get(int id) 
     { 
      //Thread.Sleep(1000); <-- breaks when uncommented!!! 
      return ConvertToModel(_blogRepository.ById(id)); 
     } 

     private BlogModel ConvertToModel(BlogPost b) 
     { 
      return new BlogModel { DateCreated = b.DateCreated, Title = b.Title, Content = b.Content, Id = b.Id }; 
     } 
    } 

htm л

<section> 
    <div class="row"> 
     <textarea class="sceditor span12" data-bind="html: post.content"></textarea> 
    </div> 
    <div class="row"> 
     <button type="button" class="btn offset10 span1">Cancel</button> 
     <button type="button" class="btn btn-primary span1">Save</button> 
    </div> 
</section> 
+0

Есть ли ошибки привязки? Вы можете попробовать: var postObservable = ko.mapping.fromJS ({content: ''}); ' – nemesv

+0

нет ошибки привязки. Он отлично работает, если Thread.Sleep (1000) не существует. –

ответ

5

Ajax вызов является асинхронной задачей, так что вы должны вернуть обещание. Выполнение этого способа сделает Durandal до тех пор, пока не закончится вызов ajax.

return $.ajax(
    { 
     type: "GET", 
     url: '/api/blog/get', 
     data: { id: id }, 
     dataType: "json", 
    }) 
.then(function(data){ 
    ko.mapping.fromJS(data, postObservable); 
}); 
+0

Работал, как шарм, спасибо! Мне потребовалось некоторое время, чтобы увидеть разницу в коде, поэтому для тех из вас, у кого есть подобные проблемы, просто поставьте возврат перед ajax, и он будет выполняться синхронно. –