2014-11-17 44 views
2

我認爲標題超級誤導,但問題很簡單。如何從子模型調用父方法(淘汰賽)

好的,讓我來看看這個問題 - fiddler

我有三個型號:BoardViewModel,列表,卡

OK,長話短說,list模型創建一個名爲陣列cards
self.cards = ko.observableArray(cards);(線79)

敲除依次暴露myObservableArray.remove()作爲ko.observableArray()一部分。

這又使我拋棄投放他們的目的,像這樣
self.cards.remove(card);(99行)

Q卡:有什麼辦法,我打電話從card模型刪除()?
或者我是否需要在列表模型中定義另一個功能,並通過card對象以便能夠撥打與99線上的電話相同的電話?
self.archive = function (card)(68行)

提示:點擊編輯鏈接/按鈕,找到存檔按鈕

+0

請不要忘記給予好評有用的答案 –

回答

1

展開List對象上的createCard方法,來處理List所有Card對象的創建:

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(''); 
     } 
    } 
} 

注意它推到observableArray持有Card S插入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變化,當你從一個列表拖動到另一個更新此屬性。在您的List模型

self.cardMoved = function(args) { 
    args.item.containingArray(args.targetParent); 
} 
0

您可以將父列表的參考卡在構造函數中添加(額外PARAM ),則:

self.archive = function() { 
    self.parentList.removeCard(self); 
}; 

JSFiddle

你需要處理父母的變化,就像@James說的那樣。

+0

它需要更新'parentList',因爲它是從一個列表移動到另一個在'sortable'結合 –

3

其他的答案都很好

<div class="cards" data-bind="sortable: { data: cards, afterMove: cardMoved }"> 

具有相應的功能,但它似乎像你解決這個問題:你可以添加其他選項結合做到這一點一個令人困惑的方式。將卡片作爲一個類的整個想法是,它不需要知道它所在的數組(如果它包含在數組中)。

的視圖會處理這個淘汰賽首選方式,如果你有一個按鈕,你的卡上的「刪除」,在視圖中這樣寫:

<div data-bind="foreach: cards"> 
    <div class="card"> 
    <div class="content"> ... </div> 
    <button data-bind="click: $parent.cards.remove">Remove</button> 
    </div> 
</div> 

這種方式,你可以保持您從其容器中分離出的卡片類具有處理在該特定視圖中從其容器中移除卡的優雅方式。

+0

這可以工作,假設HTML是卡模型需要能夠告訴其父應該刪除的唯一地方。如果你想提示進行確認,然後取出卡,例如? – Retsam

+1

實際上,我已經在HTML中的編輯鏈接/按鈕旁邊有一個刪除按鈕。它利用功能和線路99將卡完全從數據庫和卡陣列中移除。但是,當我存檔一張卡時,我已經正確更新了數據庫,並且唯一缺少的一點是從卡陣列中刪除對象,以便用戶不再看到它。 – iiminov

1

我的解決方案有點類似於James的,但我更喜歡將回調傳遞給對象,而不是整個父列表; (和我辦卡建設不同)

因此該顯卡的構造看起來像

var Card = function (id, title, description, contentItemId, removeCallback) { 
    //Rest unchanged 
    self.archive = function() { 
     removeCallback(self); 
    }; 
} 

然後,你的列表將是這個樣子:(注意,從cardscardData的變化)

var List = function (id, name, cardData, sortOrder) { 
    var self = this; 

    function removeCard(card) { 
     self.removeCard(card); 
    } 

    self.cards = ko.observableArray(cardData.map(function (data) { 
     //Construct a card object from the provided data 
     return new Card(data.id, data.title, data.description, data.contentItemId, removeCard); 
    })); 
    //Rest unchanged 
} 

最後,構建你的列表時,你會改變從

new Card(1, "Document all code", "Document all classes, methods and properties in source code.", -1), 
每張卡

{ 
    id: 1, 
    name: "Document all code", 
    description: "Document all classes, methods and properties in source code.", 
    contentItemId: -1 
} 

JSFiddle

+1

你當然是對的。實際上,我正在爲我正在開發的這個項目提供數據庫支持。所以數據以JSON格式到達。而不是var list = function(id,name,cardData,sortOrder)''我有''var list = function(item)''。使事情更容易處理。 – iiminov

+0

從我的理解中,我只能將回調函數傳遞給已經聲明爲「function func()''的函數?當我嘗試使用聲明爲「self.removeCard = function(card)''的函數時收到錯誤。 – iiminov

+0

不;無論他們是如何聲明的,您都可以傳遞迴調。如果您將其聲明爲'self.removeCard',但您需要將其作爲'self.removeCard'傳遞,而不是簡單地'removeCard'。 – Retsam