从另一个局部视图(MVC)向viewmodel中的observable数组添加项

时间:2013-09-18 17:25:10

标签: asp.net-mvc asp.net-mvc-4 knockout.js

我是淘汰赛的新手。我正在开发一个MVC应用程序,我想实现knockoutJS,但场景有点不同。

我有一个页面,我正在显示一个列表。我在页面上有3个链接,点击它们我会相应地添加部分视图。我想要做的是,每当我向部分视图添加值/数据时,页面上的列表应该使用knockout更新。换句话说,当我从局部视图保存数据时,我想为可观察数组添加值。

请告诉我这是否可行,或者我应该只保留在jquery中。

以下是代码:

主要观点:

<input type="button" value="Add Partial View" onclick="LoadPartial();" />
<div id="dvContent"></div>
<h4>People</h4>
<ul data-bind="foreach: people">
<li>
    Name at position <span data-bind="text: $index"> </span>:
    <span data-bind="text: name"> </span>
    <a href="#" data-bind="click: $parent.removePerson">Remove</a>
</li>
</ul>
<button data-bind="click: addPerson">Add</button>
<script src="~/Scripts/jquery-1.7.1.js"></script>
<script src="~/Scripts/knockout-2.1.0.js"></script>
<script>
function LoadPartial() {
    $.ajax({
        url: "/home/index",
        dataType:"html",
        type: "GET",
        success: function (data) {
            $("#dvContent").html(data);
        }
    });
}
</script>
<script>

function AppViewModel() {
    var self = this;

    self.people = ko.observableArray([
        { name: 'Bert' },
        { name: 'Charles' },
        { name: 'Denise' }
    ]);

    self.addPerson = function () {
        self.people.push({ name: "New at " + new Date() });
    };

    self.removePerson = function () {
        self.people.remove(this);
    }
}

ko.applyBindings(new AppViewModel());

</script>

部分视图:

<table>
<tr>
    <td>Add new Row</td>
    <td><input type="button" value="Add" data-bind="click: addPerson"/></td>
</tr>
</table>

谢谢, JsHunjan

1 个答案:

答案 0 :(得分:0)

使用Knockout很容易实现。如果您想获得一些帮助,您需要显示一些您尝试过的代码。我将发布一般性答案,但它不会完全修复您的用例,基本上 -

创建一个对象来保存您的新项目,您可以在父视图模型或子视图模型中执行此操作,但如果您在子视图中执行此操作,则需要将其传递回父项。

在子视图模型中点击保存按钮或添加或其他内容后,只需在您创建的observableArray中执行.push() - myObservableArray.push(newItem());

Knockout将识别正在发生的所有更改并自动执行您想要的操作。

希望这有帮助。