2017-02-11 91 views
1

拿這個例子:在Knockout中從observableArray中移除自我?

var ViewModel = function(data) 
{ 
    this.users = ko.mapping.fromJS(data, 
     { 
      create: opts => new UserModel(opts.data), 
     }); 
} 


var UserModel = function(data) 
{ 
    ko.mapping.fromJS(data, {}, this); 

    this.remove = function(user) 
    { 
     $.ajax({ 
      type: 'DELETE', 
      url: API+'user', 
      data: ko.mapping.toJSON(this), 
      contentType: 'application/json', 
      context: this, 
      success: function(data) 
      { 
       // How to remove from array? 
       this.parent.users.remove(this); // ? 
      }, 
     }); 
    }; 
} 

<a href="javascript:void(0)" data-bind="click: remove">Remove</a> 

有沒有辦法從數組我當成功處理程序被稱爲是刪除「自己」?

或者是將移除方法移到父級並將其綁定到下面的唯一方法?

<a href="javascript:void(0)" 
    data-bind="click: $parent.remove.bind($parent, $data)>Remove</a> 

注:我在類似的問題看這裏,但找不到任何在對這一確切的情況明確的答案。當與ajax請求結合時(即它不應該被刪除,直到成功),是否可以完成,如果沒有,應該如何執行應該是

回答

2

不知道您是否已經嘗試了這種方法,但嘗試將ViewModel傳入UserModel。這並不理想,但您無法在ajax call的範圍內獲得users集合的參考,而無需通過ViewModel

var ViewModel = function(data) 
{ 
    var self = this; 
    this.users = ko.mapping.fromJS(data, 
    { 
     create: opts => new UserModel(opts.data, self), 
    }); 
} 

var UserModel = function(data, parentContext) 
{ 
    ko.mapping.fromJS(data, {}, this); 
    var self = this; 

    this.remove = function(user) 
    { 
     $.ajax({ 
      type: 'DELETE', 
      url: API+'user', 
      data: ko.mapping.toJSON(this), 
      contentType: 'application/json', 
      context: this, 
      success: function(data) 
      { 
       parentContext.users.remove(this); 

       // or 
       // parentContext.users.remove(self);     

       // or 
       // parentContext.users.remove(function(user) 
       // { 
       // return user.Id == self.Id; 
       // }); 
      }, 
     }); 
    }; 
} 
+0

我得到一個錯誤說'parent'未在此定義/自。 *理論上應該可以在'this'上得到嗎? – Svish

+0

你試過了什麼樣的?第一種方法?或驗證方法? – jtabuloc

+0

我沒有意識到你的用戶集合來自ViewModel。掛上我會更新它。或者直接將viewModel傳遞給UserModel。這並不理想,只是爲了測試目的,看看會發生什麼。 – jtabuloc

0
  1. 最簡單的方法是從移動的usermodel您刪除功能到視圖模型,並更改點擊結合click: $parent.remove。當前項目仍然傳遞到該函數中,並且您也可以訪問該集合。

    jsFiddle-1

  2. 如果由於某種原因remove函數必須是對的usermodel那麼我可能會設置一個事件處理程序,通過使用可觀察到的財產破解,並有父視圖模型訂閱通知該財產。你必須調整你的ko.mapping create函數來爲每個UserModel添加訂閱。

    jsFIddle-2

+0

@svish第一次意外地貼錯了小提琴。小提琴1的鏈接現在應該是正確的代碼。 –

相關問題