knockout js foreach binding is not updating when used in custom element (components.register)

此生再无相见时 提交于 2020-01-15 12:13:43

问题


  ko.components.register("toast-container", {
    viewModel: ToastViewModel,
    template: '<div data-bind="foreach: array1"><div data-bind="text:someText"> </div></div>'
});

function ToastViewModel(params) {
    var self = this;
    self.array1 = ko.observableArray();
    self.Onclick = function () {
        self.array1.push({ someText: "some content" });
    }
}
$(function () {
    ko.applyBindings(new ToastViewModel());
});

When i push some content in array1 dynamically, the UI is not updating. Please help me.


回答1:


Check this:

ko.components.register("toast-container", {
    viewModel: ToastViewModel,
    template: '<div class="array" data-bind="foreach: array1"><div data-bind="text:someText"> </div>  </div>    <button data-bind="click: Onclick">Click me</button>      '
});

function ToastViewModel(params) {
    var self = this;
    self.array1 = ko.observableArray();
    self.Onclick = function () {
        //alert("click!");
        self.array1.push({ someText: "some content" });
    }
}
$(function () {
    ko.applyBindings({}, $("#host")[0]);
});
#host {
    width: 300px;
    height: 300px;
    border: 1px solid red;
}

.array {
    border: 1px solid green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="host">
    <div data-bind="component: { name: 'toast-container'}"></div>
</div>

Note: the model is created inside component, thus you need not to create a new one in the applyBindings function call.

Update 1: Button is outside the component, component model has been splitted.

ko.components.register("toast-container", {
    viewModel: ToastContainerViewModel,
    template: '<div class="array" data-bind="foreach: array"><div data-bind="text:someText"> </div>  </div>          '
});

function ToastContainerViewModel(params) {
    self.array = params.array;
}
function ToastViewModel(params) {
    var self = this;
    self.array1 = ko.observableArray();
    self.Onclick = function () {
        //alert("click!");
        self.array1.push({ someText: "some content" });
    }
}
$(function () {
    ko.applyBindings(new ToastViewModel(), $("#host")[0]);
});
#host {
    width: 300px;
    height: 300px;
    border: 1px solid red;
}

.array {
    border: 1px solid green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="host">
    <button data-bind="click: Onclick">Click me</button>
    <toast-container params="array: array1"></toast-container>
</div>



回答2:


It looks like the onclick is never getting called. Check out this fiddle: http://jsfiddle.net/jonr22/w36yuLvr/.

All I've done is bind your onclick event so that it actually gets called, and I added a default item to the array so that it can be clicked, like this:

ko.components.register("toast-container", {
    viewModel: ToastViewModel,
     template: '<div data-bind="click: Onclick, foreach: array1"><div data-bind="text:someText"></div></div>'
});

function ToastViewModel(params) {
    var self = this;
    self.array1 = ko.observableArray([{someText: 'foo'}]);
    self.Onclick = function () {
        self.array1.push({ someText: "some content" });
    }
}
$(function () {
    ko.applyBindings(new ToastViewModel());
});


来源:https://stackoverflow.com/questions/28167757/knockout-js-foreach-binding-is-not-updating-when-used-in-custom-element-compone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!