如何从外部jquery .ajax调用中在我的viewmodel上引用observableArray?

时间:2012-03-02 19:51:00

标签: knockout.js

我有一个像这样定义的knockoutjs viewmodel:

    function TestViewModel() {
    var self = this;
    self.matches = ko.observableArray([]);
    self.selectedItem = ko.observable(self.matches()[0]);
    self.SelectMatch = function (match) {
        self.selectedItem(match);
    };
    self.setMatchList = function (_data) {
        self.matches(_data);
    };
}

我还有一个使用直接javascript从click事件调用的函数 - 没有涉及knockoutjs数据绑定。该脚本从服务器中检索JSON数组,如下所示:

        $.ajax({
        type: 'post',
        contentType: "application/json; charset=utf-8",
        url: "/FindMatches",
        timeout: 10000,
        data: JSON.stringify({ firstname: $("#Person_ProperFirstname").val(), lastname: $("#Person_ProperLastname").val(), gender: $("#Person_Gender").val().substring(0, 1) }),
        success: function (results) {
            if (results.length < 1) {
                //setErrorMessage("No matches were found.");
            }
            else {
                //setErrorMessage("");
                $.each(results, function (item) {
                    TestViewModel.matches.push(item);
                });
                $("#parent_dialog").dialog("open");
            }

现在我想更新我的viewmodel上的匹配observableArray,并从服务器返回结果,但我无法弄清楚如何执行此操作。除了你在上面的脚本中看到的,我还尝试了以下内容:

else {
   TestViewModel.matches(results);
}
//also this
else {
   TestViewModel.setMatchList(results); }

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

我假设您的代码使用类似于:

的行初始化您的ko绑定

ko.applyBindings(new TestViewModel(data.d));

如果要创建模型实例的变量,可以在其他代码中引用它。

var _tvm = new TestViewModel(data.d);
ko.applyBindings(_tvm);

然后你的ajax结果将会是这样的:

else {
   _tvm.matches(results);
}

这可能不完全正确,但应该让你接近......

答案 1 :(得分:0)

我认为数据是一个对象,你需要它作为一个数组。我已经使用mapping plugin轻松地为我做了转换:

$.getJSON('/casestudies', function(data) {
    vm.casestudies = ko.mapping.fromJS(data);
    ko.applyBindings(vm);
});

另外,对于您的示例,您必须手动执行映射:

        $.each(results, function (item) {
            TestViewModel.matches.push(item);
        });

上面的仍然是一个对象,所以你还需要预先知道项目的属性并将其映射到你的ko模型,看看ko's json page

// Load and parse the JSON
var someJSON = /* Omitted: fetch it from the server however you want */;
var parsed = JSON.parse(someJSON);

// Update view model properties
viewModel.firstName(parsed.firstName);
viewModel.pets(parsed.pets);