首页 文章

Ajax添加了ko.applyBindings与knockoutjs绑定后添加的HTML元素

提问于
浏览
2

我有一个使用KnockoutJs(版本2.3.0)的ASP.NET MVC 4视图 . 该页面加载得很好,任何具有 data-bind 属性的 Existing 元素与KnockoutJs一样正常工作 . 问题是,如果我将包含 data-bind 的页面添加到已绑定的ViewModel中已包含的observable的页面,即使它具有正确的data-bind属性,它似乎也没有订阅 . 通过Ajax添加的HTML是MVC PartialView .

HTML (Starting)

<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 (within a .js file)

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 Controller: 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 (After 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的正确数据绑定凭据?

Updated: 我已更新上述代码参考资料 .

1 回答

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

相关问题