knockout.js - Access viewmodel in knockout mapping plugin -


i using knockout mapping plugin add computed property item in observable array. however, computed property relies on different property in viewmodel.

how access viewmodel property when creating observable during mapping?

please note cannot use options.parent, because property further in viewmodel.

i unable change viewmodel, because generated server side.

edit:

here's jsfiddle shows issue. line commented out need working.

http://jsfiddle.net/g46mt/2/

this have now, throwing error:

var mapping = {     'collection': {         create: function(options) {             var model = ko.mapping.fromjs(options.data);             model.total = ko.computed(function() {                 var result = this.price() * viewmodel.count(); // :(                 return result;             }, model);              return model;         }     } };  var json = { ... large json object ... }; var viewmodel = ko.mapping.fromjs(json, mapping); 

one possible solution use {deferevaluation: true} option. computed function evaluated when viewmodel ready , total property used:

var mapping = {     'collection': {         create: function(options) {             var model = ko.mapping.fromjs(options.data);             model.total = ko.computed(function() {                 var result = this.price() * viewmodel.count();                 return result;             }, model, {deferevaluation: true});             return model;         }     } }; 

demo jsfiddle.

however approach tightly coupling view model name mapping options. because if ever change var viewmodel = ko.mapping.fromjs(json, mapping); , name viewmodel differently have update mapping configuration.

because there no way walk "parent" chain in mapping config scenario mapping plugin not best solution...

here alternative approach using handwritten viewmodels , passing down "root" needed:

var mainviewmodel = function (json) {         ko.mapping.fromjs(json, { 'ignore': ["foo"] }, this); //map rest     this.foo = new fooviewmodel(json.foo, this); }  var fooviewmodel = function (json, root) {     ko.mapping.fromjs(json, { 'ignore': ["bar"] }, this); //map rest     this.bar = new barviewmodel(json.bar, root); }  var barviewmodel = function (json, root) {     ko.mapping.fromjs(json, { 'ignore': ["collection"] }, this); //map rest     this.collection = ko.mapping.fromjs(json.collection, {        create: function(options) {             var model = ko.mapping.fromjs(options.data);             model.total = ko.computed(function() {                 var result = this.price() * root.count();                 return result;             }, model);              return model;         }}); } 

demo jsfiddle.


Comments

Popular posts from this blog

java - Intellij Synchronizing output directories .. -

git - Initial Commit: "fatal: could not create leading directories of ..." -