2

My MVC view:

@model MG.ViewModels.Profile.ProfileDetailsViewModel
<div>
<h4>About Me</h4>
<!-- ko if: !isEditingAboutMe() -->
<p data-bind="text: aboutMe()">@Model.AboutMe</p>
@if (Model.CurrentUserCanEdit)
{
    <a data-bind="click: editAboutMe">edit</a>
}
<!-- /ko -->
<!-- ko if: isEditingAboutMe() -->
@Html.TextBoxFor(model => model.AboutMe, new { data_bind = "value: aboutMe" })
<a data-bind="click: saveAboutMe">save</a>
<a data-bind="click: cancelAboutMe">cancel</a>
<!-- /ko -->
</div>

<script type="text/javascript">ko.applyBindings(@Html.Raw(Json.Encode(Model)));</script>

My ProfileVm Javascript:

function ProfileVm() {
var self = this;

self.saveAboutMe = function() {
    self.isEditingAboutMe(false);
};

self.cancelAboutMe = function() {
    self.isEditingAboutMe(false);
};

self.isEditingAboutMe = ko.observable(false);
self.editAboutMe = function() {
    self.isEditingAboutMe(true);
};

}

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

I'm loading ProfileVm in Layout.cshtml via a bundle:

    @Scripts.Render("~/bundles/viewmodels")

I'm calling ko.applyBindings() twice - once directly in my view to bind the MVC Model to knockout observables, and the other to bind the properties of the ProfileVm.

What am I doing wrong?

4

2 に答える 2

7

ko.applyBindings複数のイベント ハンドラーが同じ要素に追加されたり、異なるデータが要素にバインドされたりする可能性があるため、同じ要素を複数回呼び出してはなりません。KO 2.3 では、これにより例外がスローされるようになりました。

ko.applyBindingsバインディングで使用するルート要素を示す 2 番目の引数を受け入れます。

したがって、次のようなことが可能です。

<div id="left">
   ....
</div>

<div id="right">
   ....
</div>

次に、次のようにバインドします。

ko.applyBindings(leftViewModel, document.getElementById("left"));
ko.applyBindings(rightViewModel, document.getElementById("right"));

要素が実際に重なり合うシナリオがある場合は、次のようにする必要があります: http://www.knockmeout.net/2012/05/quick-tip-skip-binding.html

于 2013-09-17T02:15:20.290 に答える