我认为标题极具误导性,但问题很简单。

好吧,让我将它放在透 View -fiddler中。

我有三种模型:BoardViewModel,List,Card

好吧,总的来说,list模型创建了一个名为cards的数组。self.cards = ko.observableArray(cards);(第79行)

淘汰赛又将myObservableArray.remove()公开为ko.observableArray()的一部分。

反过来,这让我可以抛弃达到其目的的卡片self.cards.remove(card);(第99行)

问:我可以通过card模型调用remove()吗?
还是我需要在列表模型中定义另一个函数并传递card对象,以便能够进行与第99行相同的调用?self.archive = function (card)(第68行)

提示:单击编辑链接/按钮以找到“存档”按钮

最佳答案

createCard对象上扩展List方法,以处理该Card中所有List对象的创建:

self.createCard = function (id, title, description, contentItemId) {
    if (id) {
        self.cards.push(new Card(id, title, description, contentItemId, self.cards));
    } else {
        var title = $('#textTitle').val().trim();
        if (title.length > 0) {
            var newCard = new Card(-1, title, "", -1, self.cards);
            self.cards.push(newCard);
            // clear data
            $('#textTitle').val('');
        }
    }
}

注意,它将对包含observableArrayCard的引用推入Card对象。然后,card对象可以保留并使用它:
var Card = function(id, title, description, contentItemId, list) {
    var self = this;

    this.containingArray = ko.observable(list);

    /*...*/


    self.archive = function (card) {
        self.containingArray.remove(self);
    };

}

但是,当父List从一个列表拖到另一列表时,您需要更新此属性。您可以在绑定(bind)中添加另一个选项来执行此操作:
<div class="cards" data-bind="sortable: { data: cards, afterMove: cardMoved }">

List模型中具有相应的功能
self.cardMoved = function(args) {
    args.item.containingArray(args.targetParent);
}

关于knockout.js - 如何从子模型中调用父方法( knockout ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26973855/

10-13 01:35