Knockoutjs单页应用绑定问题
Knockoutjs Single Page Application binding issues
您好,我正在使用 Knockoutjs、Sammy.js 和 Rest Web API 开发一个 .Net
单页应用程序。我对这些库有些陌生,我已经 运行 了解一些核心设计问题,我希望获得一些见解。
我遇到的主要问题是使用针对特定元素的敲除 ko.applybinding。
this.get("#/Classroom", function(context) {
dataPack.build(PageLoc, context)
appPres.reload();
ko.applyBindings(new classroomVmCore.View(), document.getElementById('view-Classroom'));
});
因为这是一个单页应用程序,所以我必须动态附加我的视图。 dataPack.build
是抓住我的视图并绑定到单个页面的上下文的东西。该功能按预期工作正常,但是当涉及到 ko.applyBindings
时,我发现出现以下问题..
任何页面刷新都会丢失我的视图模型,如果未命中 sammy.js
哈希,则数据丢失。这个问题主要发生在任何共享内容(例如导航项、布局项等)上,因为当我再次点击 #/Classroom
哈希时,这些数据有自己的视图模型,那些共享模型都丢失了。
除了为我的视图模型使用下面的构造函数之外,他们还有另一种选择吗?将其设置为一个变量,然后尝试调整或添加到该变量似乎并没有调整我的模型。
我基本上是在寻找一种方法来随时 update/refresh 我的模型,这样我就可以处理一个全新的页面。
是否有人将这些库用于 SPA 运行 以解决这些问题?您是如何构建视图和绑定的?
非常感谢任何帮助或想法。
我已经创建了自己的网站(不在此处插入,如果需要,请查看个人资料)作为带淘汰赛的 SPA。我实际上使用模板来实现我的目标。这是我如何操作的简短示例。
抱歉,我从来没有用过 sammy.js 对此有什么要说的。
function MainVM() {
var self = this;
self.ContactVM = ko.observable(new AboutMeVM('John', 'code'))
self.Content = ko.observable({
name: 'HomeTemplate'
});
self.ShowHome = function() {
// Page using MainVM
self.Content({
name: 'HomeTemplate'
});
}
self.ShowContact = function() {
// Page with on demand VM
self.Content({
name: 'ContactTemplate',
data: new ContactVM('me', "555-5555")
})
}
self.ShowContactSteve = function() {
// Page with on demand VM
self.Content({
name: 'ContactTemplate',
data: new ContactVM('Steve', "555-1234")
})
}
self.ShowAboutMe = function() {
// Page with a static VM
self.Content({
name: 'AboutMeTemplate',
data: self.ContactVM
});
}
}
function ContactVM(name, number) {
var self = this;
self.Name = ko.observable(name);
self.Phone = ko.observable(number);
}
function AboutMeVM(name, job) {
var self = this;
self.Name = ko.observable(name);
self.Job = ko.observable(job);
}
ko.applyBindings(new MainVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script type="text/html" id="AboutMeTemplate">
About me:<br> i am <span data-bind="text: Name"></span> and I <span data-bind="text: Job"></span>
</script>
<script type="text/html" id="ContactTemplate">
Contact <span data-bind="text: Name"></span>: <span data-bind="text: Phone"></span>
</script>
<script type="text/html" id="HomeTemplate">
Welcome to my website
</script>
<div>
<h3>Links</h3>
<a data-bind="click: ShowHome">Home</a> <br>
<a data-bind="click: ShowContact">Contact Me</a><br>
<a data-bind="click: ShowContactSteve">Contact Steve</a><br>
<a data-bind="click: ShowAboutMe">About Me</a><br>
<hr>
<h3> Page content</h3>
<div data-bind="template: Content"></div>
</div>
您好,我正在使用 Knockoutjs、Sammy.js 和 Rest Web API 开发一个 .Net
单页应用程序。我对这些库有些陌生,我已经 运行 了解一些核心设计问题,我希望获得一些见解。
我遇到的主要问题是使用针对特定元素的敲除 ko.applybinding。
this.get("#/Classroom", function(context) {
dataPack.build(PageLoc, context)
appPres.reload();
ko.applyBindings(new classroomVmCore.View(), document.getElementById('view-Classroom'));
});
因为这是一个单页应用程序,所以我必须动态附加我的视图。 dataPack.build
是抓住我的视图并绑定到单个页面的上下文的东西。该功能按预期工作正常,但是当涉及到 ko.applyBindings
时,我发现出现以下问题..
任何页面刷新都会丢失我的视图模型,如果未命中
sammy.js
哈希,则数据丢失。这个问题主要发生在任何共享内容(例如导航项、布局项等)上,因为当我再次点击#/Classroom
哈希时,这些数据有自己的视图模型,那些共享模型都丢失了。除了为我的视图模型使用下面的构造函数之外,他们还有另一种选择吗?将其设置为一个变量,然后尝试调整或添加到该变量似乎并没有调整我的模型。
我基本上是在寻找一种方法来随时 update/refresh 我的模型,这样我就可以处理一个全新的页面。
是否有人将这些库用于 SPA 运行 以解决这些问题?您是如何构建视图和绑定的?
非常感谢任何帮助或想法。
我已经创建了自己的网站(不在此处插入,如果需要,请查看个人资料)作为带淘汰赛的 SPA。我实际上使用模板来实现我的目标。这是我如何操作的简短示例。
抱歉,我从来没有用过 sammy.js 对此有什么要说的。
function MainVM() {
var self = this;
self.ContactVM = ko.observable(new AboutMeVM('John', 'code'))
self.Content = ko.observable({
name: 'HomeTemplate'
});
self.ShowHome = function() {
// Page using MainVM
self.Content({
name: 'HomeTemplate'
});
}
self.ShowContact = function() {
// Page with on demand VM
self.Content({
name: 'ContactTemplate',
data: new ContactVM('me', "555-5555")
})
}
self.ShowContactSteve = function() {
// Page with on demand VM
self.Content({
name: 'ContactTemplate',
data: new ContactVM('Steve', "555-1234")
})
}
self.ShowAboutMe = function() {
// Page with a static VM
self.Content({
name: 'AboutMeTemplate',
data: self.ContactVM
});
}
}
function ContactVM(name, number) {
var self = this;
self.Name = ko.observable(name);
self.Phone = ko.observable(number);
}
function AboutMeVM(name, job) {
var self = this;
self.Name = ko.observable(name);
self.Job = ko.observable(job);
}
ko.applyBindings(new MainVM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script type="text/html" id="AboutMeTemplate">
About me:<br> i am <span data-bind="text: Name"></span> and I <span data-bind="text: Job"></span>
</script>
<script type="text/html" id="ContactTemplate">
Contact <span data-bind="text: Name"></span>: <span data-bind="text: Phone"></span>
</script>
<script type="text/html" id="HomeTemplate">
Welcome to my website
</script>
<div>
<h3>Links</h3>
<a data-bind="click: ShowHome">Home</a> <br>
<a data-bind="click: ShowContact">Contact Me</a><br>
<a data-bind="click: ShowContactSteve">Contact Steve</a><br>
<a data-bind="click: ShowAboutMe">About Me</a><br>
<hr>
<h3> Page content</h3>
<div data-bind="template: Content"></div>
</div>