【问题标题】:Knockout JS binnding the ajax resultKnockout JS绑定ajax结果
【发布时间】:2016-12-08 18:38:27
【问题描述】:

我是 Knockout JS 的新手,我正在尝试将 ajax 结果数据绑定到 Knockout JS 视图模型,但是在将数据绑定到视图时遇到了问题,我已经创建了模型和视图模型,并且我从阿贾克斯。需要帮助。

下面是我的代码:

// ajax on page load///
$.ajax({
    type: "POST",
    dataType: "json",
    url: baseUrl + 'api/xxx/xxx',
    data: UserProfileModel,
    success: function(data) {
        result = data;
        ////view model////
        userDetailsViewModel(result);
    },
    error: function(error) {
        jsonValue = jQuery.parseJSON(error.responseText);
        //jError('An error has occurred while saving the new part source: ' + jsonValue, { TimeShown: 3000 });
    }
});

//// view model///
var userDetailsViewModel = function(result) {
    console.log(result);
    self = this;
    self.user = ko.observable(new userModel(result));
};

$(document).ready(function() {
    ko.applyBindings(userDetailsViewModel());
});

/// Model////
function userModel(result) {
    this.name = ko.observable();
    this.userName = ko.observable();
}

【问题讨论】:

  • userDetailsViewModel 应该返回自我。目前它没有返回任何东西。因此 View 没有 ViewModel 公开的属性。因此,您的代码不起作用。

标签: javascript jquery ajax knockout.js


【解决方案1】:
  1. 您的userDetailsViewModel 是一个返回undefined 的函数。如果要创建实际的视图模型,则必须使用 new 或创建 return 语句。例如:

    var UserDetailsViewModel = function(result) { 
      var self = this;
      self.user = ko.observable(new UserModel(result));
    };
    
    var mainUserDetailsViewModel = new UserDetailsViewModel(data);
    
  2. 如果你想从 ajax 回调的范围内更新你的视图模型,你必须存储一个引用。或者,您可以将 ajax 功能 作为视图模型的一部分。最简单的例子:

    var mainUserDetailsViewModel = new UserDetailsViewModel(data);
    
    $.ajax({ 
      success: function(data) {
        mainUserDetailsViewModel.user(new UserModel(data));
      }
    });
    

    确保在applyBindings 通话中使用此模型:

    ko.applyBindings(mainUserDetailsViewModel);
    

请注意,我将CapitalizedNames 用于需要实例化的函数,将uncapitalizedNames 用于这些函数的实例。遵循默认命名约定可能有助于跟踪内容。

【讨论】:

  • 谢谢,但绑定到 UI 我无法在跨度标签
  • 使用当前userModel 的代码,根本不会处理实际数据。所以name 将永远是undefined,导致一个空字符串。您必须通过在构造函数中执行类似this.name = ko.observable(result.Name) 的操作来设置它。
  • 谢谢,但我像 userModel(result) 一样在构造函数中传递了值,我不会得到任何错误,但我分配 this.name= ko.observable(result[0].name) 或 this。 name= ko.observalbe(result.name) 它显示错误无法读取 userModel 中未定义的属性“名称”
  • 如果result 可以是未定义的,你应该在尝试初始化一个新的人物模型之前检查它的值。传递给您的 success 方法的 data 是什么样的?
  • 感谢您重播,但是当我通过类似的 userModel(result) 时,我在 usermodel 中获得了结果中的数据;但是当我分配喜欢 this.name=ko.observable(result[ 0].name) 或 this.name=ko.observable(result.name) 它在页面加载时给我错误“无法读取未定义的属性'userProfile'”,我是否让自己变得复杂需要帮助
猜你喜欢
  • 2017-06-19
  • 2016-12-09
  • 2018-10-19
  • 1970-01-01
  • 2013-06-29
  • 2014-02-21
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多