I have a problem with binding of JQuery and Knockout!
I don’t know where my problem is! Maybe anyone of you could take a look on this fiddle
This is how I try to go to the next Knockout ViewModel:
masterViewModel.loginVM(null);
masterViewModel.startVM(new StartVM());
That’s my MasterViewModel
var masterViewModel = {
loginVM: ko.observable(),
startVM: ko.observable(),
};
if JQuery mobile is not used (bind into my ASP.NET MVC4 project) it works fine
Here is the same fiddle, just that jQuery is not used: [fiddle]http://jsfiddle.net/B2A5f/)
When I try this in ASP.NET MVC4 it doesn’t work right!
<form action="" data-bind=" template:{ 'if': loginVM, data: loginVM }">
//SomeCode
</form>
<form action="" data-bind=" template:{ 'if': startVM, data: startVM}">
//Some Code
</form>
<script type="text/javascript">
var masterViewModel = {
loginVM: ko.observable(),
startVM: ko.observable(),
projektUnterbrechen: ko.observable(),
logout : ko.observable(),
projectStartVM: ko.observable()
};
var LoginVM = function () {
var self = this;
self.mandant = ko.observable();
self.user = ko.observable();
self.password = ko.observable();
self.showDetails = function () {
if ((self.user() == "Gregor") && (self.password() == "gregrech")) {
masterViewModel.loginVM(null);
masterViewModel.startVM(new StartVM());
}
else {
alert("Username oder Passwort falsch");
}
};
};
var StartVM = function () {
self = this;
//Um weiterzumachen muss man eingeloggt sein
self.favoriten = ko.observableArray([
{
projectName: "Favorit1"
},
{
projectName: "Favorit2"
},
{
projectName: "Favorit3"
}
]);
//Die zuletzt verwendeten Projekte
self.zuletzt = ko.observableArray([
{
lastProjName: "Zuletzt1"
},
{
lastProjName: "Zuletzt2"
},
{
lastProjName: "Zuletzt3"
}
]);
self.showStart = function (projectName, data, event) {
masterViewModel.projectStartVM(new ProjectStartVM(projectName));
masterViewModel.startVM(null);
};
};
masterViewModel.loginVM(new LoginVM());
$(document).on('pageinit', function () {
ko.applyBindings(masterViewModel);
});
</script>
Instead of binding:
Like this, try:
And of course hidden in CSS would be:
That is the status quo way of showing one thing or another with knockout.
After seeing your second fiddle I checked what version of knockout you are using – it’s 1.2.0. So, what I did is upgrade your fiddle with 2.2.0 http://jsfiddle.net/2Ed98/2/ and it works as expected. Knockout had problems with compatibility around version 1.