2013-02-17 17 views
0

我正在使用ko.mapping.fromJS(數據,映射)方法從服務器翻譯我的模型,以便我可以添加更多屬性到我的子模型。在knockoutjs中自定義對象「create」 - 屬性綁定對加載起作用,但在創建新對象時不起作用

以下這裏的例子: http://knockoutjs.com/documentation/plugins-mapping.html =>創建‘

這裏是我的代碼「使用自定義對象的構造’:

var Employer = function (data) { 
     ko.mapping.fromJS(data,{}, this); 
     this.Foo = ko.observable("bar"); // added properties will go here. 

     console.log(this.Foo());  // i see this getting called OK on initial creation, and subsequent creations 
     console.log(this.Name()); // ** this is only OK during initial creation, but on subsequent times i get "[Object] does not have a property Name" this property comes from the server model..** 
     }; 

     var mapping = {  
      'Employers' : { 
       create: function (options) { 
        var e = new Employer(options.data); 
        return e; 
       } 
      } 
     }; 

     model = ko.mapping.fromJS(data, mapping); 

至今工作正常

的問題發生這裏:

 model.addEmployer = function (options, o2) { 
      var e = new Employer(options); 
      this.Resume.Employers.push(e); 
     }; 

我在這裏丟失了一些東西..當我想向集合中添加一個新對象時,它缺少來自模型(來自服務器)的所有屬性,這些屬性是用這行添加的「ko.mapping.fromJS數據,{},this); 「僱主構造函數中

我猜測我需要重複addEmployer功能,將重新綁定所有的服務器端屬性的客戶端模型

這裏是如何我打電話addEmployer裏面的一些類似的映射:

<button data-bind="click: addEmployer">...</button> 

UPDATE

什麼把它歸結爲,是在映射聲明 '創建' 事件時,該功能接收OPTIO ns object,其中有options.data可用於此調用:ko.mapping.fromJS(data,{},this); ..我不知道如何在我的addEmployer處理程序中獲得這種類型的對象,以便爲服務器上的Employer對象上存在的所有屬性提供必要的綁定。

我可以通過從初始綁定中保留options.data來破解它,並在addEmployer處理程序中重新使用它。問題在於它是否具有從該初始對象設置的所有屬性。

我基本需要的是EmployerMappingOptions對象,它是空的。在上面的實現中,options.data預先填充了我集合中第一個Employer對象的數據。 我如何獲得空僱主模型的映射數據?

+0

這是正確的,你逝去的_this_作爲目的地的addEmployer方法中的映射轉換?也許你想將數據加載到新僱主_e_中? – Grim 2013-02-17 22:55:59

+0

@Grim是的,我已經嘗試了一些方法在這裏..我會用它更新我的問題。 – 2013-02-18 01:09:19

+0

爲什麼你先映射兩次,在構造函數中,然後再返回時? – Anders 2013-02-18 08:03:30

回答

0

想通了解決方案。

  1. 暴露問題的子類(子模型)爲主要示範

    公共ResumeEmployer EmptyEmployer的屬性{ {返回新ResumeEmployer(); }}

  2. 創建它的JSON表示

    變種newEmployerJson = @ Html.Raw(Json.Encode(Model.EmptyEmployer));

  3. 在客戶端上創建新的僱主時,使用空定義的JSON綁定

    var Employer = function (data) { 
         if (data) 
          ko.mapping.fromJS(data,{}, this); // existing data in serialized model 
         else 
          ko.mapping.fromJS(newEmployerJson, {}, this); // json of single empty Employer class 
         ... 
        }     
    
0

您的問題是,你不添加任何數據時,在add函數映射

可以:給它一個虛擬數據對象 http://jsfiddle.net/mfauL/1/

this.Employers.push(new EmployerViewModel({ Name: "" })); 

或顯式聲明的名稱可觀察到的(較受歡迎的方式) http://jsfiddle.net/mfauL/2/

EmployerViewModel = function (data) { 
    this.Foo = ko.observable("bar"); 
    this.Name = ko.observable(); 

    ko.mapping.fromJS(data,{}, this); 
}; 
+0

內的調用,就像我說的模型來自服務器。 初始數據變量具有我的模型和子模型的整個JSON。做到以上的點,仍然是能夠添加到子模型的東西。 ..並且該映射的重點是添加來自該服務器的該模型的所有屬性。這實際上工作的第一次綁定..它只是在我添加新的僱主時丟失 – 2013-02-18 16:42:48

+0

我試圖避免必須重新定義我的整個模型在JavaScript代碼,因爲它來自服務器。 – 2013-02-18 16:44:37

+0

我想到了這一點:ko.mapping.fromJS(data,{},this);在構造函數中,它會將所有綁定添加到來自初始JSON的屬性 – 2013-02-18 16:47:40

相關問題