2012-06-05 1 views
3

При использовании плагина сопоставления KO для модели представления, а затем привязки к выбору, значение не задано.Отображение нокаута, по-видимому, прерывает привязку значения для выпадающего списка

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'));​ 

Модель просмотра без плагина сопоставления работает нормально.

ответ

0

Я столкнулся с той же проблемой перед пустым объектом, что, похоже, не создает наблюдаемого .... что означает, что диспетчер - это простой объект, что означает вычисление никогда не срабатывает.

например, измените его на ... (обратите внимание: я сменил менеджера: {} на менеджера: '', который затем дает ему что-то, чтобы преобразовать в наблюдаемое. преобразовать в функции 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); 
    }); 
}; 

Я не уверен, если это ошибка в отображении плагин, и с не преобразования к наблюдаемым , а также не преобразовать в правильный 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) 
+0

Вы правы - переключение на «» или нуль, как начальное значение управляющего говорит отображение для создания наблюдаемого для него. Это может быть ошибкой ... Что определенно похоже на ошибку, так это то, что ko.mapping.toJS не включает менеджера, даже если он, похоже, отслеживает его. Новая скрипка: http://jsfiddle.net/JerryClinesmith/hsx7P/ –

+0

https://github.com/SteveSanderson/knockout.mapping/issues/79 –

+0

https://github.com/SteveSanderson/knockout.mapping/issues/ 80 –