2

我在使用 Knockout.js 及其映射插件时遇到了一些问题。本质上,我想从没有数据开始,然后在页面加载时发出 Ajax 请求以加载信息。我知道 Ajax 请求正在按预期工作,因为我正在将返回的数据记录到控制台。

    var projectId = @Model.Project.Id;
    var stories;
    viewModel = ko.mapping.fromJS(stories);       

    $.ajax({
        type: "GET",
        url: "/Projects/JsonDetails",
        data: {id: projectId},
        success: function (data) {
            stories = data.stories;
            ko.mapping.fromJS(stories, viewModel);
            console.log(stories);
        }
    });

控制台正在正确记录数据。所以我知道 Ajax 请求工作正常。

控制台正在正确记录数据。 所以我知道 Ajax 请求工作正常。 l

查看标记:

   <section id="project-stories"  data-bind="foreach: stories">

            <div class="project-story-container drop-shadow">

                <div class="story-summary">
                    Story Summary
                </div>
                <div class="story" data-bind="attr:{'data-id': Id}">
                    As a <span  class="actor" data-bind="text: Actor"> </span> I want to <span  class="objective" data-bind="text: Objective"> </span>, so that  <span  class="justification" data-bind="text: Justification"></span>.
                </div>
                <div class="story-controls">
                    <a href="#">Edit</a>
                </div>
            </div>
        </section>

我什至试过打电话:

   var projectId = @Model.Project.Id;
    var stories;
    viewModel = ko.mapping.fromJS(stories);
     ko.applyBindings(viewModel);

    $.ajax({
        type: "GET",
        url: "/Projects/JsonDetails",
        data: {id: projectId},
        success: function (data) {
            stories = data.stories;
            ko.mapping.fromJS(stories, viewModel);
            console.log(stories);
        }
    });

但这只会让事情变得更糟,因为 KO 抱怨没有设置绑定。 在此处输入图像描述

谁能看到我做错了什么?最终我希望视图模型有更多的事件连接,我知道这将是另一个挑战。但是现在我什至无法在 Ajax 请求完成时正确更新绑定。

离开这里的教程:http: //knockoutjs.com/documentation/plugins-mapping.html

- - - - - - - - - - 更新 - - - - - - - - - - - - -

我可以通过参考这个 StackExhange 帖子来回答我自己的问题:

Knockout JS 映射插件混淆

var projectId = @Model.Project.Id;
    var viewModel ={};
    $.ajax({
        type: "GET",
        url: "/Projects/JsonDetails",
        data: {id: projectId},
        success: function (data) {
            viewModel.stories = ko.mapping.fromJS(data.stories);
            ko.applyBindings(viewModel);
        }
    });

问题是我需要一个空的视图模型才能工作。

4

2 回答 2

0

问题在于您进行映射的方式。您不应该映射data.storiesdata它本身ko.mapping.fromJS(data, viewModel); 这样映射插件将为您可以在模板中使用的故事创建一个可观察的数组。

如果data包含您不想映射的其他元素,您可以将它们添加到忽略数组中,以便仅映射故事。

还有一件事 - 如果您从没有数据开始,您将在页面加载时收到此错误,因为stories当此类属性不存在时,Knockout 将尝试在您的视图模型中进行映射。提前定义您的视图模型以包含stories为可观察数组。

于 2012-03-13T22:06:34.893 回答
0

@Marek Karbarz 嗨,我不认为您应该传递整个视图模型。例如,如果您有一个页面模型,则该模型有一个 SearchCriteria 对象和 Results 对象。当您只需要进行搜索时,为什么要将 Results 对象传回?

-爱德华

于 2012-10-10T18:27:43.627 回答