Javascript 如何在敲除组件中访问viewModel?

Javascript 如何在敲除组件中访问viewModel?,javascript,ajax,knockout.js,Javascript,Ajax,Knockout.js,我试图在DocumentReady上预先填充一个淘汰组件 我编写了以下代码: function Finding(id, trigger) { var self = this; self.id = ko.observable(id); self.trigger = ko.observable(trigger); } function FindingViewModel() { let self = this; self.findings = ko.obse

我试图在DocumentReady上预先填充一个淘汰组件

我编写了以下代码:

function Finding(id, trigger) {
    var self = this;
    self.id = ko.observable(id);
    self.trigger = ko.observable(trigger);
}

function FindingViewModel() {
    let self = this;

    self.findings = ko.observableArray();

    self.addFinding = function () {
        self.findings.push(new Finding(self.findings().length + 1, ""));
    };
    self.removeFinding = function (finding) {
        self.findings.remove(finding);
        ko.utils.arrayForEach(self.findings(), function (value, i) {
            self.findings.replace(value, new Finding(i + 1, value.trigger()));
        });
    };
    self.update = function (data) {
        var findings = data.findings;
        for (var index = 0; index < findings.length; ++index) {
            var finding = findings[index];
            self.findings.push(new Finding(self.findings().length + 1, finding.trigger));
        }

    };
}

ko.components.register('finding', {
    template: `<table>
            <tbody data-bind="foreach: findings">
            <tr>
            <td><span data-bind="text: id"/></td>
            <td><input data-bind="value: trigger"/></td>
            <td><a href="#" data-bind="click: $parent.removeFinding">Remove</a></td>
            </tr></tbody></table>
            <button data-bind="click: addFinding">Add a Finding</button>`,

    viewModel: FindingViewModel

});

$(function () {
    ko.applyBindings();
    $.getJSON("/_get_findings", function (data) {
        //findingModel.update(data);
    })
});

如何从查找组件访问基础Viewmodel以从getJSON函数内部设置数据?

thx to Jeroen解决方案如下所示:

function FindingViewModel() {
    let self = this;

    self.findings = ko.observableArray();


    self.addFinding = function () {
        self.findings.push(new Finding(self.findings().length + 1, ""));
    };

    self.removeFinding = function (finding) {
        self.findings.remove(finding);
        ko.utils.arrayForEach(self.findings(), function (value, i) {
            self.findings.replace(value, new Finding(i + 1, value.trigger()));
        });
    };

    self.update = function (data) {
        let findings = data.findings;
        for (let index = 0; index < findings.length; ++index) {
            let finding = findings[index];
            self.findings.push(new Finding(self.findings().length + 1, finding.trigger));
        }

    };

    $.getJSON("/_get_findings", function (data) {
        self.update(data);
    });
}

如果该组件在页面上被多次使用,您希望发生什么?乍一看,在视图模型构造函数中调用$.getJSON并让它在每个组件实例中执行一次似乎更有意义!ThxAwesome!成功了。非常感谢你!BR JörnGood看到它起作用了。不过要小心,在您发布的确切答案中似乎有一些语法错误。