【问题标题】:Knockout + MVC - You cannot apply bindings multiple times to the same elementKnockout + MVC - 您不能将绑定多次应用于同一个元素
【发布时间】:2013-09-21 07:41:30
【问题描述】:

我的 MVC 视图:

@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>

我的 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());
})

我正在通过捆绑包在 Layout.cshtml 中加载 ProfileVm:

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

我调用了 ko.applyBindings() 两次——一次直接在我的视图中将 MVC 模型绑定到可淘汰的可观察对象,另一次是绑定 ProfileVm 的属性。

我做错了什么?

【问题讨论】:

  • 你为什么要同时标记版本 3 和 4?
  • @lc。因为这是使用 MVC3 和 MVC4 的人可能会遇到的问题
  • Knockout 如何理解绑定到同一个视图的两个不同视图模型?

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


【解决方案1】:

您不应多次对同一元素调用ko.applyBindings,因为它可能会向同一元素添加多个事件处理程序和/或将不同的数据绑定到元素。在 KO 2.3 中,这现在会引发异常。

ko.applyBindings 确实接受第二个参数,该参数指示要在绑定中使用的根元素。

因此,可以执行以下操作:

<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

【讨论】:

  • 我收到此错误,但我的根元素不重叠,我无法弄清楚发生了什么?这个错误还有其他原因吗?
【解决方案2】:

@RPNiemeyer 对这个问题提供了很好的解释。但我认为与其尝试应用两个视图模型,更简单的解决方案是将您的视图模型组合成一个。像这样的:

function ProfileVm(model) {
    var self = this;
    self.aboutMe = ko.observable(model.AboutMe);

    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(@Html.Raw(Json.Encode(Model))));
})

【讨论】:

  • 谢谢。如果我的 javascript 视图模型位于不同的文件中怎么办?这不会迫使他们进入视野吗?
  • 抱歉,@RobVious,我对 ASP.NET 不够熟悉,无法提供帮助。
  • 我不知道为什么,但我有一个错误的 jquery 选择器,没有选择任何内容,结果是给定的错误消息。一旦我更改选择器以找到正确的元素,问题就消失了。
猜你喜欢
  • 2017-01-20
  • 2020-03-12
  • 2014-01-22
  • 2018-11-22
  • 2016-09-26
  • 2018-03-18
  • 2013-07-16
  • 2013-09-27
  • 2014-04-13
相关资源
最近更新 更多