Wir verwenden die Bibliothek Chosen
mit RequireJs
und KnockOut
. Alles funktionierte gut, bis wir von RequireJS
zu commonjs
wechselten und jetzt webpack
bündeln. Das Problem ist, dass die knockout observable
nicht aktualisiert wird, wenn wir den Wert in chosen
Dropdown ändern.Knockout-Observable wird nicht aktualisiert, wenn der Dropdown-Wert für die Auswahl geändert wird
Hier ist der JavaScript-Code, der mit RequireJs
arbeitete.
define(['knockout', 'text!./employee-setup.html', 'utils', 'panel-section', 'toastr', 'jquery', 'knockout-postbox', 'knockout-projections', 'chosen', 'jsteps'], function (ko, template, utils, PanelSection, toastr, $, _, _, _, jsteps) {
function EmployeeSetup(params) {
var self = this;
this.agentTypes = ko.observableArray();
this.agentType = ko.observable();
this.loadAgentTypes = function() {
$.ajax({
url: '/Employee/GetAgentTypes',
method: 'POST',
dataType: 'json',
success: function (result) {
if (utils.handleAjaxResult(result) && result.Data) {
self.agentTypes([]);
var agentType = [{ ID: "", Name: "" }];
$.each(result.Data, function (i, item) {
agentType.push({ID: item.ID, Name: item.Name});
});
self.agentTypes(agentType);
$('#agentType').chosen({ allow_single_deselect: true, width: '310px' });
$('#agentType').trigger("chosen:updated");
} else {
}
},
error: function() {
toastr.error('Could not load agent types');
}
});
};
self.loadAgentTypes();
};
return { template: template, viewModel: EmployeeSetup };
});
Der HTML-Code für diese Komponente:
<div class="input-container" data-bind="">
<select data-bind="value: agentType, options: agentTypes, optionsText: 'Name'" data-placeholder="Select Agent Type..." id="agentType" class="chosen-select sp-uin-dropdown" tabindex="2"> </select>
</div>
Hier ist der Code commonjs
var ko = require('knockout'),
utils = require('utils'),
PanelSection = require('panel-section'),
toastr = require('toastr'),
$ = require('jquery');
require('knockout-postbox');
function ViewModel(params) {
var self = this;
this.agentTypes = ko.observableArray();
this.agentType = ko.observable();
this.loadAgentTypes = function() {
$.ajax({
url: '/Employee/GetAgentTypes',
method: 'POST',
dataType: 'json',
success: function (result) {
if (utils.handleAjaxResult(result) && result.Data) {
self.agentTypes([]);
var agentType = [{ ID: "", Name: "" }];
$.each(result.Data, function (i, item) {
agentType.push({ID: item.ID, Name: item.Name});
});
self.agentTypes(agentType);
$('#agentType').chosen({ allow_single_deselect: true, width: '310px' });
$('#agentType').trigger("chosen:updated");
} else {
}
},
error: function() {
toastr.error('Could not load agent types');
}
});
};
self.loadAgentTypes();
}
module.exports = { viewModel: ViewModel, template: require('./template.html') };
Und es ist mit der gleichen html
Datei wie oben. In der webpack.config.js
definieren wir den Pfad zu jquery
und chosen
.
Es lädt die chosen dropdown
korrekt. Wenn jedoch subscribe
beobachtbar ist, wird der Wert nicht aktualisiert, wenn sich das Dropdown ändert. Ich sehe den Wert nur einmal beim ersten Laden von der Konsole.
self.agentType.subscribe(function (value) {
console.log('value', value);
}, this)
Nur wenige Beiträge hier in SO vorgeschlagen, bindingHandlers
zu verwenden. Ich habe diesen Arbeitscode von JSFiddle in meiner Anwendung ausprobiert, aber ich bekomme nur den Wert von der anfänglichen Belastung.
Irgendwelche Vorschläge zur Lösung dieses Problems oder was verursacht dies?