Knockoutjs选择值更改不会更新observable

时间:2013-02-28 16:57:01

标签: javascript knockout.js

我有一个select选项,它从EmailField获取其初始值及其来自allEmailFields的选项:

<select data-bind="options: $parent.allEmailFields, value: EmailField()"></select>

当我更改select的值时,我的模型不会更新。是不是这种双向约束应该照顾的东西?或者我需要为change事件编写处理程序?

模块在这里:

    define('mods/fieldmapping', ["knockout", "libs/knockout.mapping", "datacontext", "mods/campaigner", "text!templates/fieldmapping.html", "text!styles/fieldmapping.css"],
function (ko, mapping, datacontext, campaigner, html, css) {
    'use strict';
    var
        fieldMappingItem = function (data) {
            var self = this;
            self.CrmField = ko.observable(data.CrmField);
            self.EmailField = ko.observable(data.EmailField);
        },
        dataMappingOptions = {
            key: function (data) {
                return data.PlatformFieldName;
            },
            create: function (options) {
                return new fieldMappingItem(options.data);
            }
        },
        fieldMappingViewModel = {
            contentLoading: ko.observable(false)
        },
        showFieldMapping = function () {
            campaigner.addStylesToHead(css);
            campaigner.addModalInnerPanel(html);
        },
        init = function (connectionId, connectionName) {            
            fieldMappingViewModel.fieldMappings = mapping.fromJS([]);
            fieldMappingViewModel.allEmailFields = mapping.fromJS([]);            
            fieldMappingViewModel.originatorConnectionName = ko.observable();
            fieldMappingViewModel.originatorConnectionName(connectionName);
            fieldMappingViewModel.saveFieldMappings = function () {
                console.log(ko.toJSON(fieldMappingViewModel.fieldMappings));
                amplify.request("updateExistingFieldMappings", 
                    {
                        cid: connectionId,
                        RequestEntity: ko.toJSON(fieldMappingViewModel.fieldMappings)
                    },
                    function (data) {
                        console.log(data);
                    });
            };
           showFieldMapping();

            amplify.request('getExistingFieldMappings', { cid: connectionId }, function (data) {
                amplify.request("getCampaignerFields", function (breezerData) {
                    mapping.fromJS(breezerData.ResponseEntity, fieldMappingViewModel.allEmailFields);
                });                
                mapping.fromJS(data.ResponseEntity, dataMappingOptions, fieldMappingViewModel.fieldMappings);                
                ko.applyBindings(fieldMappingViewModel, $('#fieldMapping')[0]);
            });
        };
    return {
        init: init,
        fieldMappingViewModel: fieldMappingViewModel,
        html: html,
        css : css
    }
});

1 个答案:

答案 0 :(得分:6)

替换:

<select data-bind="options: $parent.allEmailFields, value: EmailField()"></select>

使用:

<select data-bind="options: $parent.allEmailFields, value: EmailField"></select>

如果你想创建双向直接依赖,那么你应该传递给可观察的绑定。

P.S。http://knockoutjs.com/documentation/observables.html#observables