2013-01-22 64 views
1

所以,在我的第一个星期,我想我已经得到了良好的原型: (下调和去除ajaxy话费)KnockoutJS 2.0映射并且使用基因敲除修改映射对象

http://jsfiddle.net/NelsonLamprecht/39dfx/

"use strict"; 

var steeringTeamSheetViewModel = function (serviceUrl) { 
var self = this; 
self.viewModel = ko.mapping.fromJS([]); 

self.InitializeAjax = function() { 
    //abbreviated 
}; 

self.GetData = function() { 
    //abbreviated 
    var data = { 
     "Sections": [{ 
      "ProjectType": "BUSINESS EXPANSION", 
       "Projects": [{ 
       "ID": "767a46a2-ddba-435c-a9f9-fdb9f0175337", 
        "ItemOrder": 0, 
        "ProjectName": "project abc" 
      }, { 
       "ID": "0e36d7da-92e6-4f1b-939d-936d6e759115", 
        "ItemOrder": 0, 
        "ProjectName": "project abc" 
      }, { 
       "ID": "f6e447d4-955d-48e0-bcdf-6db9044b7a89", 
        "ItemOrder": 0, 
        "ProjectName": "project a" 
      }] 
     }, { 
      "ProjectType": "OPER & MAINT - EFFICIENCY", 
       "Projects": [{ 
       "ID": "9883a3c8-d01e-4fc9-8f66-9b46d720afde", 
        "ItemOrder": 0, 
        "ProjectName": "project q" 
      }] 
     }, { 
      "ProjectType": "OTHER", 
       "Projects": [{ 
       "ID": "f1ccfa79-c5b1-4880-b5a1-1c2350e709e1", 
        "ItemOrder": 0, 
        "ProjectName": "project 1" 
      }] 
     }] 
    }; 
    self.ProcessRetrievedData(data); 
}; 

self.ProcessRetrievedData = function (retrievedData) { 
    self.viewModel(retrievedData); 
}; 

self.GetData(); 
}; 
var steeringTeamSheetService = 'someurl'; 
var sts = new steeringTeamSheetViewModel(steeringTeamSheetService); 
ko.applyBindings(sts); 

我现在试图做的是将ko.oberservableArray更改为另一个绑定,如 .indexed(),它在那里漂浮。

http://jsfiddle.net/NelsonLamprecht/39dfx/19/

"use strict"; 

var steeringTeamSheetViewModel = function (serviceUrl) { 
var self = this; 
var mapping = { 
'sections': { 
    create: function(options) { 
     alert(options); 
    } 
} 
} 
self.viewModel = ko.mapping.fromJS([],mapping); 

self.InitializeAjax = function() { 
    //abbreviated 
}; 

self.GetData = function() { 
    //abbreviated 
    var data = { 
     "Sections": [{ 
      "ProjectType": "BUSINESS EXPANSION", 
       "Projects": [{ 
       "ID": "767a46a2-ddba-435c-a9f9-fdb9f0175337", 
        "ItemOrder": 0, 
        "ProjectName": "project abc" 
      }, { 
       "ID": "0e36d7da-92e6-4f1b-939d-936d6e759115", 
        "ItemOrder": 0, 
        "ProjectName": "project abc" 
      }, { 
       "ID": "f6e447d4-955d-48e0-bcdf-6db9044b7a89", 
        "ItemOrder": 0, 
        "ProjectName": "project a" 
      }] 
     }, { 
      "ProjectType": "OPER & MAINT - EFFICIENCY", 
       "Projects": [{ 
       "ID": "9883a3c8-d01e-4fc9-8f66-9b46d720afde", 
        "ItemOrder": 0, 
        "ProjectName": "project q" 
      }] 
     }, { 
      "ProjectType": "OTHER", 
       "Projects": [{ 
       "ID": "f1ccfa79-c5b1-4880-b5a1-1c2350e709e1", 
        "ItemOrder": 0, 
        "ProjectName": "project 1" 
      }] 
     }] 
    }; 
    self.ProcessRetrievedData(data); 
}; 

self.ProcessRetrievedData = function (retrievedData) { 
    self.viewModel(retrievedData); 
    //I think I should be using something like 
    //self.viewModel = ko.mapping.fromJSON(retrievedData,mapping,{}); 
}; 

self.GetData(); 
}; 
var steeringTeamSheetService = 'someurl'; 
var sts = new steeringTeamSheetViewModel(steeringTeamSheetService); 
ko.applyBindings(sts); 

然而,如果没有这一切,我不认为我下面从web服务(C#)建立模型,并获取数据正确的模式。

有人可以验证我正在做这个权利,以及帮助创建模式?

回答

0

据我了解您的问题,您尝试通过ajax下载数据并将其存储在您的steeringTeamSheetViewModel属性'viewModel'中。你的方式对我来说很好。

你不应该覆盖self.viewModel。因为如果ko.applyBindings已经运行到这一点,你会打破绑定。

self.ProcessRetrievedData = function (retrievedData) { 
    // map the data from the viewModel and update self.viewModel 
    self.viewModel(ko.mapping.fromJSON(retrievedData,mapping,{})); 
}; 

请记住,如果您有大视图模型,ko.mapping将变得非常慢。

+0

这确实工作,我能够通过映射对象附加到创建方法。我确实发现ko.mapping速度很慢,所以我创建了自己的方法,实际上是将嵌套数组映射到正确的对象。谢谢 – Nelson