【问题标题】:knockout's viewModel does not get updated淘汰赛的 viewModel 没有得到更新
【发布时间】:2013-08-30 04:58:48
【问题描述】:

我有以下淘汰赛的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,它会写“未定义”

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

PS

看来我解决了选项 1。但仍然不明白为什么选项 2 不起作用

【问题讨论】:

    标签: json knockout.js updatemodel


    【解决方案1】:

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

    var whatsTheValue = myVM.MyObservable();
    

    然后你这样设置:

    myVM.MyObservable(newValue);
    

    这一切都在docs

    但是,请注意,当在 HTML 中使用 data-bind 语法时,您不需要使用括号显式解开 observable,因为 KO 足够聪明,可以自动完成:

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

    【讨论】:

      【解决方案2】:

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

      var myViewModel = {
          businessName = ko.observable('')
      };
      
      ...
      
      $.ajax({
          ...
          success: function(result) {
              myViewModel.businessName(result.vm.BusinessName);
          },
          ...
      });
      

      否则你的视图不会有任何你改变businessName的线索。在实现 ko.observable 中,除了实际存储新值之外,还会向您的视图广播一些事件,让它知道存储的值已更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多