3

ビュー モデルに KO マッピング プラグインを使用し、select にバインドすると、値が設定されません。

jsFiddle:

http://jsfiddle.net/JerryClinesmith/pCn9E/

HTML:

<h1>With ko.mapping (manager not set)</h1>
<div id="option-mapping">
    <select data-bind="options: availManagers, value: manager, optionsText: 'name', optionsCaption: 'Pick one'"></select>
    <div data-bind="text: json"></div>
</div>

<h1>Without ko.mapping (manager is set)</h1>
<div id="option-no-mapping">
    <select data-bind="options: availManagers, value: manager, optionsText: 'name', optionsCaption: 'Pick one'"></select>
    <div data-bind="text: json"></div>
</div>​

JavaScript:

var origData = {
manager: {},
availManagers: [
    {id: 1, name: 'Tom'},
    {id: 2, name: 'Joe'},
    {id: 3, name: 'James'}]
};

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

    ko.mapping.fromJS(data, {}, self);

    self.json = ko.computed(function() {
        return ko.toJSON(ko.mapping.toJS(self));
    });
};

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

    self.manager = ko.observable(data.manager);
    self.availManagers = ko.observableArray(data.availManagers);

    self.json = ko.computed(function() {
        var obj = ko.toJS(self);
        delete obj.json;
        return ko.toJSON(obj);
    });
};

var vm = new ViewModel(origData);
var vm2 = new ViewModelNoMapping(origData);
ko.applyBindings(vm, document.getElementById('option-mapping'));
ko.applyBindings(vm2, document.getElementById('option-no-mapping'));​

マッピング プラグインのないビュー モデルは、期待どおりに動作するようです。

4

1 に答える 1

0

以前に空のオブジェクトで同じ問題に遭遇しました.observableを作成していないようです....つまり、マネージャーはプレーンオブジェクトであり、計算されたオブジェクトはトリガーされません。

たとえば、次のように変更します... (注: manager: {} を manager: '' に変更しました。これにより、オブザーバブルに変換する何かが与えられます。これにより、物事はうまくいきます... json 関数への変換も変更されました、もう一方はマネージャーの値を表示していないようでした。

 manager: '',
    availManagers: [
        {
        id: 1,
        name: 'Tom'},
    {
        id: 2,
        name: 'Joe'},
    {
        id: 3,
        name: 'James'}]
};

var ViewModel = function(data) {
    var self = this;
    //self.manager = ko.observable();
    ko.mapping.fromJS(data, {}, self);
    self.json = ko.computed(function() {
         var obj = ko.toJS(self);
        delete obj.json;
        return ko.toJSON(obj);
    });
};

これがマッピングプラグインのバグであるかどうかはわかりません.observableに変換されず、表示用の正しいjsonに変換されません.

確認のために、マッピングプラグインをダウンロードしてテストを書きました:-

test('mapping an object creates a observable', function () {
    var data = {
        a : {}      
    };

    var mapped = ko.mapping.fromJS(data);  
  equal(ko.isObservable(mapped.a), true);
});

結果とともに

failed
Expected:   true
Result:     false
Diff:   true false 
Source:     at Object.<anonymous> (file:///C:/OpenSourceReps/Knockout/mapping/spec/mappingBehaviors.js:1635:3)
于 2012-06-05T04:25:21.670 に答える