Knockout.js 为什么我的敲除映射会杀死我的$.change函数?

Knockout.js 为什么我的敲除映射会杀死我的$.change函数?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我有以下Javascript和Html代码,在MVC4应用程序中运行良好 @model string <script src="@this.Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"> </script> <script src="@this.Url.Content("~/Scripts/jquery.signalR.js")" type="text/javascript"

我有以下Javascript和Html代码,在MVC4应用程序中运行良好

@model string
<script src="@this.Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"> </script>
<script src="@this.Url.Content("~/Scripts/jquery.signalR.js")" type="text/javascript"> </script>
<script src="@this.Url.Content("~/Scripts/knockout.js")" type="text/javascript"> </script>
<script src="@this.Url.Content("~/Scripts/knockout.mapping-latest.js")" type="text/javascript"> </script>
<script type="text/javascript" src="/signalr/hubs"> </script>
<script type="text/javascript">
    $(function() {
        function outingDataViewModel() {
            var self = this;
            self.hub = $.connection.outings;
            self.ID = ko.observable();
            self.OutingNumber = ko.observable();
            self.OutingName = ko.observable();
            //Initializes the view model
            self.init = function () {
                self.hub.getOuting('@this.Model');
            };
            self.hub.updateOuting = function (data) {                    
                self.ID(data.ID);
                self.OutingName(data.OutingName);
                self.OutingNumber(data.OutingNumber);
            };

            self.updateOuting = function () {
                var outing = { "ID": self.ID(), "OutingNumber": self.OutingNumber(), "OutingName": self.OutingName() };
                self.hub.saveOuting(outing);
            };
        }

        var vm = new outingDataViewModel();
        ko.applyBindings(vm);
        // Start the connection
        $.connection.hub.start(function () { vm.init(); });
        $('.data').change(function () { vm.updateOuting();} );
    });
</script>

<div  id="OutingSummary">
    <div data-bind="text:OutingNumber"></div>
    <input data-bind="value:OutingName" class="data"/>
</div>
@模型字符串
$(函数(){
函数outingDataViewModel(){
var self=这个;
self.hub=$.connection.outings;
self.ID=ko.observable();
self.OutingNumber=ko.observable();
self.OutingName=ko.observable();
//初始化视图模型
self.init=函数(){
self.hub.getOuting('@this.Model');
};
self.hub.updateOuting=函数(数据){
self.ID(data.ID);
self.OutingName(data.OutingName);
self.OutingNumber(data.OutingNumber);
};
self.updateOuting=函数(){
var outing={“ID”:self.ID(),“OutingNumber”:self.OutingNumber(),“OutingName”:self.OutingName()};
self.hub.saveOuting(outing);
};
}
var vm=新的outingDataViewModel();
ko.应用绑定(vm);
//启动连接
$.connection.hub.start(函数(){vm.init();});
$('.data').change(函数(){vm.updateout();});
});
但是当我尝试通过执行以下操作来实现映射时,我的$('.data').change(函数(){vm.updateOuting();});从未接到过电话。Chrome开发者工具似乎没有捕捉到任何错误,我也不知所措。信息被绑定到html,就在我从文本框中弹出tab时,什么也不会触发。(与前面相同的脚本引用)

$(函数(){
函数outingDataViewModel(){
var self=这个;
self.hub=$.connection.outings;
self.Outing=ko.observable();
//初始化视图模型
self.init=函数(){
self.hub.getOuting('@this.Model');
};
self.hub.updateOuting=函数(数据){
self.Outing(ko.mapping.fromJS(数据));
};
self.updateOuting=函数(){
var outing={“ID”:self.outing.ID(),“OutingNumber”:self.outing.OutingNumber(),“OutingName”:self.outing.OutingName();
self.hub.saveOuting(outing);
};
}
var vm=新的outingDataViewModel();
ko.应用绑定(vm);
//启动连接
$.connection.hub.start(函数(){vm.init();});
$('.data').change(函数(){vm.updateout();});
});

很难说到底是什么问题,也许JSFIDLE会有所帮助?在绑定之前,似乎没有填充Outing,因此在调用applyBindings时,Outing()。OutingName未定义,您是否在控制台中收到任何js错误

另一方面,knockout值绑定在内部使用change事件更新其可观测值。因此,在大多数情况下不需要使用Jquery更改事件。既然已经将值绑定到OutingName,为什么不在outingDataViewModel中用该方法替换change()方法呢

self.Outing().OutingName.subscribe(function() { 
    self.updateOuting();
});
编辑

这是一个简单的版本,可以工作。我注意到你的updateOuting方法在访问Outing observable的名称之前没有调用它。这通常会导致错误。我没有包括信号R的东西,因为我从来没有用过它


希望这能有所帮助,

您对可观察对象的看法绝对正确……我之所以使用jQuery,是因为还有几十个文本框会导致最终产品中的保存。给它们一类“数据”并一次绑定它们要容易得多。啊,我理解,所以你想通过使用一个Jquery选择器来避免大量订阅。你对self.hub.update的看法是正确的,它需要$('data')调用才能工作。
self.Outing().OutingName.subscribe(function() { 
    self.updateOuting();
});