【发布时间】:2013-10-02 14:34:57
【问题描述】:
我有一个使用 KnockoutJs(版本 2.3.0)的 ASP.NET MVC 4 视图。页面加载得很好,任何具有 data-bind 属性的 Existing 元素都可以按预期使用 KnockoutJs。问题是,如果我将 HTML 添加到包含 data-bind 的页面中,该页面已经包含在已绑定的 ViewModel 中的可观察对象,即使它具有正确的数据绑定属性。通过 Ajax 添加的 HTML 是 MVC PartialView。
HTML(开始)
<input type="text" id="FullName" data-bind="value: FullName" />
<input type="text" id="Units" data-bind="value: Price" />
<input type="text" id="Price" data-bind="value: Units" />
<div id="AdditionalData"></div>
KO 视图模型
var ViewModel = function() {
var self = this;
self.FullName = ko.observable('Bob');
self.Units = ko.observable(@Model.Units);
self.Price = ko.observable(@Model.Price);
self.SomeValue = ko.observable();
self.CalculatedCost = ko.computed(function() {
return self.Units * self.Price;
};
};
ko.applyBindings(new ViewModel());
AJAX(在 .js 文件中)
APP.GetPartialView = function () {
var _formValues = $("form#MyForm").serializeArray();
var _url = $Url.resolve("~/Shared/_PartialViewName/?" + $.param(_formValues));
function _success(html) {
$("#AdditionalData").html(html);
};
$.ajax({
url: _url,
data: _formValues,
cache: false,
dataType: "html",
success: _success
});
};
MVC 控制器:PartialViewResult
[HttpGet]
public virtual PartialViewResult _PartialViewName(AccountViewModel model)
{
return PartialView(model);
}
MVC PartialView HTML
@model APP.AccountViewModel
<fieldset>
@Html.Hidden("SomeValue", new { data_bind="value: SomeValue" })
<ul>
<li>
@Html.LabelFor(m => m.FullName)
<span data-bind="text: FullName"></span>
</li>
<li>
@Html.LabelFor(m => m.CalculatedCost)
<span data-bind="text: CalculatedCost"></span>
</li>
</ul>
</fieldset>
HTML(Ajax 调用后)
<input type="text" id="FullName" data-bind="value: FullName" />
<input type="text" id="Units" data-bind="value: Price" />
<input type="text" id="Price" data-bind="value: Units" />
<div id="AdditionalData">
<fieldset>
<label for="SomeValue" data_bind="value: SomeValue" />
<input type="hidden" id="SomeValue" name="SomeValue" data_bind="value: SomeValue" />
<ul>
<li>
<label for="FullName" />
<span data-bind="text: FullName"></span>
</li>
<li>
<label for="CalculatedCost" />
<span data-bind="text: CalculatedCost"></span>
</li>
</ul>
</fieldset>
</div>
新添加的 html 将不会收到 FullName 的文本,并且计算成本的 ko 计算字段不会写入同名的 observable 的值。
那么,问题是如何告诉 Knockout 这些元素只是“迟到了”,但对于已经绑定的 ViewModel 可观察对象具有正确的数据绑定凭据?
已更新:我已更新上述问题的代码参考。
【问题讨论】:
-
为什么不再次应用绑定?一般来说,您应该使用模板并使用 ko 绑定添加这个新标记。 github.com/ifandelse/Knockout.js-External-Template-Engine
-
@vittore 我的理解是每次 DOM 加载只能调用 ko.applyBindings() 一次。我已经尝试过了,它会引发错误,说明您不能多次这样做。关于模板:似乎模板更适合重复数据。上面的示例是我想要完成的简化版本,但我确实需要将模型数据从 Controller 传递到 PartialView Result 并且不太确定如何以 KO 模板方式重建它。与模板相反,似乎只需要“重新绑定”,但要接受建议。
标签: jquery ajax asp.net-mvc asp.net-mvc-4 knockout.js