knockout的viewModel没有得到更新

时间:2013-08-27 12:33:02

标签: json knockout.js updatemodel

我有以下淘汰赛的viewModel:

var viewModel = {   businessName:“”,     ....  }

我还尝试识别这样的字段:businessName:ko.observable(“”)

然后,我有一个load方法,请求带有新填充数据的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,它会写“未定义”

请告知我如何更新页面上的新数据? 我检查了类似的主题,但没有答案可以帮助

PS

似乎我解决了选项1.但仍然不明白为什么选项2不起作用

2 个答案:

答案 0 :(得分:0)

ko.observable是一个函数,而不是属性。所以你得到它的价值:

var whatsTheValue = myVM.MyObservable();

你设置如下:

myVM.MyObservable(newValue);

这一切都在docs

但请注意,在HTML中使用data-bind语法时,您无需使用括号显式展开您的observable,因为KO足够聪明,可以自动执行:

<span data-bind="text: MyObservable"></span> 

答案 1 :(得分:0)

在ViewModel中使用ko.observable并相应地访问/写入。

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

...

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

否则您的观点将无法改变businessName。在实现ko.observable中,除了实际存储新值之外,还会向您的视图广播一些事件,让它知道存储的值已更改。

相关问题