我有一个使用KnockoutJs(版本2.3.0)的ASP.NET MVC 4视图。页面加载得很好,任何带有 data-bind 属性的现有元素都可以按预期使用KnockoutJs。问题是如果我将包含 data-bind 的页面添加到已绑定的ViewModel中已包含的observable的页面,看起来即使它已经订阅了它也没有订阅正确的数据绑定属性。通过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 ViewModel
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 Call之后)
<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 observable的正确数据绑定凭据?
更新: 我已更新上述问题的代码参考。
答案 0 :(得分:1)
当淘汰赛附加,接下来,innerHTml所有这些东西都出了窗外。 问题是你正在采取错误的方式。您想使用敲除来避免这种片段注射。
以上查看模型是您的模型:
// This is the model
var Person = function(data) {
var self = this;
self.FullName = ko.observable(data.FullName);
self.Address = ko.observable(data.Address);
};
// Your viewModel now uses Person to create People:
var ViewModel = function(){
var self = this;
self.People = ko.observableArray()
self.addPeople = function(data){
for( i = 0; i < data.length; i++ ){
self.People.push(new Person(data[i]));
}
};
self.addSam = function(){
self.People.push(new Person({"FullName" : "Sam", "Address" : "Some address"}));
};
self.AddNewPerson = function(data){
self.People.push(new Person(data));
}
}
// Now I can create a new instance of VM:
var vm = new ViewModel();
vm.addPeople([{"FullName" : "Jon", "Address" : "Some address"},{"FullName" : "Pete", "Address" : "Some address"}]);
ko.applyBindings(vm);
vm.AddNewPerson({"FullName" : "Marry", "Address" : "Some address"})
您只需调用内部方法即可添加新元素,或在代码中的其他位置调用它们
<ul data-bind="foreach: People">
<li data-bind="text: FullName"></li>
</ul>
<a data-bind="click: addSam" href="#">Click me to add Sam</a>