【问题标题】:Knockout mapping seems to break value binding for dropdown淘汰赛映射似乎打破了下拉的值绑定
【发布时间】:2023-03-13 02:10:01
【问题描述】:

当对视图模型使用 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'));​

没有映射插件的视图模型似乎可以按预期工作。

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    我之前用空白对象遇到过同样的问题,它似乎没有创建可观察对象....这意味着 manager 是一个普通对象,这意味着计算永远不会触发。

    例如,将其更改为...(注意:我将 manager: {} 更改为 manager: '' ,然后将其转换为 observable 。然后使事情顺利进行...还更改了转换到 json 函数,因为另一个似乎没有显示 manager 上的值。

     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)
    

    【讨论】:

    • 你是对的 - 切换到 '' 或 null 因为 manager 的初始值告诉映射为它创建一个 observable。这可能是一个错误......看起来绝对是一个错误的是 ko.mapping.toJS 不包括管理器 - 即使它似乎正在跟踪它。新小提琴:jsfiddle.net/JerryClinesmith/hsx7P
    • 空对象没有被可观察对象包裹,似乎是设计使然:"这是设计使然,映射插件仅从非对象类型创建可观察对象。但是,如果您想覆盖此行为,您可以在映射选项中指定创建回调,以自己执行对象树特定部分的映射。"
    猜你喜欢
    • 2014-03-26
    • 2014-03-20
    • 2012-11-29
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2013-04-09
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多