淘汰——改变另一个视图模型值
Knockout - changing another viewmodel value
我在主布局中有一个标题,每个页面都有内容。主布局有自己的视图模型,每个页面中的每个内容也有自己的模型。
我遇到的问题是,当我试图更新用户配置文件时,由于两个视图模型分开,更改没有反映在标题中。当我更新配置文件时,我如何使标题立即反映实例?
// Header View Model (serve from Master Layout)
function HeaderViewModel() {
var self = this;
self.headerusername = ko.observable();
self.headerprofileImage = ko.observable(); // base 64 image
}
ko.applyBindings(new HeaderViewModel(), document.getElementById('header');
// Profile View Model (profile.html)
function ProfileViewModel() {
var self = this;
self.username = ko.observable();
self.profileImage = ko.observable(); // base 64 image
}
ko.applyBindings(new ProfileViewModel(), document.getElementById('profile');
<!-- Header (serve from master layout) -->
<header id="header">
<span data-bind="text:headerusername"></span>
<img data-bind="attr: {src:headerprofileImage }">
</header>
<!-- Update profile (profile.html) -->
<form id="profile>
<input type="text" data-bind="value:username">
<input type="file" data-bind="value:profileImage">
<button type="submit">Save</button>
</form>
您可以使用ko.contextFor(element)
从概要视图模型的方法中访问标题的绑定上下文,使用如下代码:
var headerContext = ko.contextFor(document.getElementById('header'));
headerContext.$data.headerusername(self.username());
headerContext.$data.headerprofileImage(self.profileImage());
我通常使用require.js
将每个viewModel
组织在自己的模块中。
然后我将定义一个名为ProfileService
的单例组件模块(一个总是返回同一个类的实例的模块)作为共享配置文件数据。
HeaderViewModel
和ProfileViewModel
都需要ProfileService
。
ProfileService
可以包含与API接口的方法,并且可以公开username
和profileImage
可观察对象。
HeaderViewModel
和ProfileViewModel
将从ProfileService
中导入共享的可观察对象:
File ProfileService
:
define(function() {
function ProfileService() {
var self = this;
self.username = ko.observable();
self.profileImage = ko.observable();
// logic to retrieve/update data
}
return new ProfileService();
});
File ProfileViewModel
:
define(['path/to/ProfileService', 'path/to/knockout.js'], function(ProfileService, ko) {
function ProfileViewModel() {
var self = this;
self.username = ProfileService.username;
self.profileImage = ProfileService.profileImage;
}
ko.applyBindings(new ProfileViewModel(), document.getElementById('profile');
});
[编辑]正如@Kal_Torak在评论中建议的那样,你可以在没有require.js
的情况下实现类似的东西,只是在全局命名空间中共享数据。例如:
window.ProfileService = {
username: ko.observable(),
profileImage: ko.observable()
}
但如果你还不知道require.js
,我建议你花点时间试一试。
相关文章:
- 角度指令没有更新模型视图
- “渲染骨干模型视图”返回未定义的结果
- 轮询更新主干模型/视图的请求
- 节点.js中的模型-视图-控制器模式
- 图像数据中的更改未反映在模型视图中
- 自定义 ngModel 指令以支持 jquery 插件中的模型>视图绑定
- 优化显示简单项目列表的模型/视图
- 建议:在JavaScript中难以使用模型视图控制器
- 将三维世界矢量转换为模型视图矩阵
- 在主干模型/视图上处理更复杂的验证逻辑(必填字段等)的最佳方式
- AngularJS在POST http请求上更新模型/视图
- web应用程序模型视图中的Java脚本
- 我的第一个骨干模型/视图.我的思路对吗?
- Knockoutjs的日期时间字段更新不会刷新模型视图
- Backbone.js中的嵌套集合/模型视图管理
- Javascript“this"模型视图演示器设计中的问题
- 模型视图控制器-javascript mvc框架设计实践,用于编辑就地界面
- 模型视图控制器-任何使用javascript mvc的人
- 模型视图控制器-我们是否在使用JavaScriptMVC(MVVM)框架,如Backbone.js、Angular等
- 模型视图控制器-AngularJS中是否可以在经典的javascript函数中使用数据绑定