модель нокаута не обновляется

У меня есть следующий нокаут viewModel :

var viewModel={ имя_бизнеса: "", .... }

Я также пытался идентифицировать поле следующим образом: businessName: ko.observable("")

Затем у меня есть метод загрузки, который запрашивает JSon с недавно заполненными данными.

И вот как я пытаюсь применить новые данные:

$.ajax({
                       //
                       url: "@Html.Raw(@Url.Action("Load"))",
                       type: "post",
                       data: ko.toJSON(this),
                       contentType: "application/json",
                       success: function (result) {

     //OPTION 1:
                           viewModel.businessName = result.vm.BusinessName;

     //OPTION 2:
                           var viewModel2 = ko.mapping.fromJS(result.vm);
                           console.log(viewModel2.businessName);



                       }
                   });//ajax

В результате: если я использую Option1, я получаю новые данные, но они не обновляются на странице. Если я использую Option2, он пишет «undefined»

Подскажите, пожалуйста, как обновить новые данные на странице? Я проверил похожие темы, но нет ответа, который помогает

PS

Кажется, я решил ВАРИАНТ 1. Но до сих пор не понимаю, почему ВАРИАНТ 2 не работает


person Jack Smith    schedule 27.08.2013    source источник


Ответы (2)


ko.observable — это функция, а не свойство. Таким образом, вы получаете это значение следующим образом:

var whatsTheValue = myVM.MyObservable();

и вы устанавливаете это так:

myVM.MyObservable(newValue);

Все это есть в документах.

Обратите внимание, однако, что при использовании синтаксиса data-bind в вашем HTML вам не нужно явно разворачивать наблюдаемое с помощью круглых скобок, потому что KO достаточно умен, чтобы сделать это автоматически:

<span data-bind="text: MyObservable"></span> 
person Matt Burland    schedule 27.08.2013

Вы должны использовать ko.observable в ViewModel и получать к ней доступ/писать соответственно.

var myViewModel = {
    businessName = ko.observable('')
};

...

$.ajax({
    ...
    success: function(result) {
        myViewModel.businessName(result.vm.BusinessName);
    },
    ...
});

В противном случае ваше представление не будет иметь никакого намека на то, что вы изменили businessName. В реализации ko.observable, помимо фактического сохранения нового значения, передает вашему представлению некоторые события, сообщая ему об изменении сохраненного значения.

person Sergiu Paraschiv    schedule 27.08.2013