2013-02-28 95 views
2

我有一个选择选项,从EmailField及其选项从allEmailFields获取其初始值:Knockoutjs选择值变化不会更新观察到

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

当我改变的值来选择我的模型不得到更新。这不是一种双向约束应该照顾的东西吗?或者我需要为更改事件编写处理程序?

模块是在这里:

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 
    } 
}); 

回答

6

替换:

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

有了:

<select data-bind="options: $parent.allEmailFields, value: EmailField"></select> 
如果你想创建双derectinonal依赖,所以你应该通过有约束力的观察到

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

+0

如果我离开(),那么我从data.EmailField获得初始值,但无法从视图更新它。如果我删除(),那么你是正确的,它更新可观察性,当我改变选定的选项,但我不再获得data.EmailField – XGreen 2013-02-28 17:01:34

+0

@XGreen你确定'data.EmailField'包含数据?初始值应该设置为:http://jsfiddle.net/htCSL/ – Serjio 2013-02-28 17:07:05

+0

是的我确信如果它没有数据我就不会从()中得到任何东西 – XGreen 2013-02-28 17:20:12