2012-06-05 4 views
5

Я получаю данные из службы WCF, и я карту, и связать данные с моим DOM объекта:Нокаут отображение с вычисленными полями

var PayinyVM = {}; 

    $.getJSON('/service/PaidService.svc/PaidList', function (data) { 
     var tmp = JSON.stringify(data.d); 

     PayinyVM.model = ko.mapping.fromJSON(tmp); 
     ko.applyBindings(PayinyVM); 
    }); 

результат показан в освобожденный на моем DOM привязать его к модель. Я не мог узнать, как добавить некоторые вычисленные наблюдаемые, скажем, мои данные возвращают людей с FirstName и LastName, как я могу сделать вычисленное наблюдаемое FullName с FN + '' + LN.

ответ

9

Вот рабочая копия вашей скрипке, я должен был сделать много предположений, как ваша скрипка была даже не правильно яваскрипт и, казалось, совершенно запутался и даже не ссылаться Нокаут

var PaidPeople = function(data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, this); 
    this.fullName = ko.computed(function() { 
        return self.Name() + " : just "; 
       }); 
} 

var PayinyVM = function (data) { 
       var self = this; 

       ko.mapping.fromJS(data, { 
        'model' : { 
         create: function(options) { 
          return new PaidPeople(options.data); 
        }       
        } 
       }, self);     
      }; 

var data = {model:[{__type: "PaidPeople:#model", Amount:110, Attendee:1, Name:'John'}]}; 

ko.applyBindings(new PayinyVM(data)); ​ 

и скрипка что работает: http://jsfiddle.net/qeUHd/

+1

Я уже пробовал это и получаю PayinyVM.Name не является функцией. В моей программе на самом деле я пытаюсь добавить что-то в Name. Спасибо, в любом случае. есть версия в http://jsfiddle.net/nYF67/ –

+0

ну, вы не показывали этот код ... обновите свой вопрос, чтобы показать это. –

+0

ваша скрипка - это мусор :) это не правильно javascrtipt .... –

4

Вы можете инвертировать отображение, создавая объект модели, который отображается внутри.

var PayinyVM = function (data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 
    this.fullName = ko.computed(function() { 
     return self.Name() + " : just "; 
    }); 
}; 

$.getJSON('/service/PaidService.svc/PaidList', function (data) {  
    ko.applyBindings(new PayinyVM(data.d)); 
}); 

Надеюсь, что это поможет.

+0

Спасибо лет очень много для вашей помощи, но она не работает для меня. Я изменил MyModel на PayingVM и проанализировал (данные) для синтаксического анализа (tmp), все еще получаю ошибку; «self.FirstName не является функцией внутри вычисленной функции. Любая другая коррекция. Вот мой новый код –

+0

var PayinyVM = функция (данные) { var self = this; ko.mapping.fromJS (данные, {}, Я); this.fullName = ko.computed (функция() { возвращение self.Name() + ": просто"; });} ; $ .getJSON ('/ сервис/PaidService.svc/PaidList ', функция (данные) { var tmp = JSON.stringify (data.d); PayinyVM.model = новый PayinyVM (JSON.parse (tmp)); // ko.mapping.fromJSON (tmp); ko.applyBindings (PayinyVM); }); –

+0

@FrenchiInLA - Вы правильно настроили модель, но назначили ее функции PayinyVM, которая не имеет смысла. Кроме того, нет необходимости сначала форматировать ваш json, это уже json-объект, почему сериализуется. Я отредактировал код, чтобы он соответствовал тому, что у вас есть. – madcapnmckay

2

Оказывается, я должен определить все свойства зрения модели внутри JavaScript, так что нокаут может инициализировать модель представления со свойствами, прежде чем обновлять его с данными сервера

Ссылка: http://www.underwatergorilladome.com/how-to-use-knockouts-computed-observables-with-the-mapping-plugin/

http://jsfiddle.net/GLDxx/2/

var model = { 
    username : ko.observable(), 
    get_student_info : ko.mapping.fromJS(
     { 
      usr_lname : null, 
      usr_fname : null, 
      gender : null, 
      dob : null 
     }, 
     { 
      create: function(options) { 
       return (new (function() { 
        this.name = ko.computed(function() { 
         if (this.usr_lname == undefined || this.usr_fname == undefined) 
          return null; 
         else 
          return this.usr_lname() + ' ' + this.usr_fname(); 
        }, this); 

        // let the ko mapping plugin continue to map out this object, so the rest of it will be observable 
        ko.mapping.fromJS(options.data, {}, this); 
       })); 
      } 
     } 
    ) 
}; 
+0

Проведя час, чтобы найти ответ, этот пример сделал все ясным, и теперь у меня есть то, что я хочу работать :) – carbontwelve

Смежные вопросы