Knockout.js学习之mapping插件使用

Knockout设计成允许你使用任何JavaScript对象作为view model。必须view model的一些属性是observable的,你可以使用KO绑定他们到你的UI元素上,当这些observable值改变的时候,这些UI元素就会自动更新。

绝大多数程序都需要从服务器端获取数据,但是由于服务器不知道observable的概念是什么,它只支持简单的JavaScript对象(通常是序列化以后的JSON),mapping插件可以让你很方便地将简单JavaScript对象mapp到带有observable值的view model。你也可以自己写JavaScript代码将从服务器获取的数据来构建 view model,mapping插件只是一种很好的替代而已。

例子:手工mapping
显示当前服务器时间和你网站上的当前用户数。你应该使用如下的view model来代表你的这些信息:

var viewModel = {    serverTime: ko.observable(),  numUsers: ko.observable()}

然后绑定view model到HTML元素上,如下:

The time on the server is: <span data-bind='text: serverTime'></span>and <span data-bind='text: numUsers'></span> user(s) are connected.

由于view model属性是observable的,在他们变化的时候,KO会自动更新绑定的HTML元素。

接下来,从服务器获取最新的数据。或许每隔5秒你要调用一次Ajax请求(例如,使用jQuery的 .getJSON .ajax函数):

var data = getDataUsingAjax();          // Gets the data from the server

然后,服务器返回和下面相似的JSON数据:

{    serverTime: '2010-01-07',    numUsers: 3}

最后,用这些数据更新你的view model(不使用mapping插件),代码如下:

// Every time data is received from the server:viewModel.serverTime(data.serverTime);viewModel.numUsers(data.numUsers);

为了使数据显示在页面上,所有的属性都要像这样写代码。如果你的数据结构很复杂的话(例如,包含子对象或者数组),那就维护起来就相当痛苦。mapping插件就是来让你让你的JavaScript简单对象(或JSON结构)转换成observable的view model的。

例子:使用ko.mapping
通过mapping插件创建view model,直接使用ko.mapping.fromJS函数来创建:

var viewModel = ko.mapping.fromJS(data);

它会自动将data里所有的属性创建成observable类型的属性。你可以通过ko.mapping.fromJS 函数定期从服务器获取数据,然后更新你的view model:

// Every time data is received from the server:
ko.mapping.fromJS(data, viewModel);

如何mapping?
对象的所有属性都被转换成observable类型值,如果获取的对象的值改变了,就会更新这个observable类型的值.
数组也被转换成了observable数组,如果服务器更新改变了数组的个数,mapping插件也会添加或者删除相应的item项,也会尽量保持和原生JavaScript数组相同的order顺序。

Unmapping
如果你想让map过的对象转换成原来的JavaScript对象,使用如下方式:

var unmapped = ko.mapping.toJS(viewModel);

会创建一个unmapped对象,只包含你之前map过的对象属性,换句话说,你在view model上手工添加的属性或者函数都会被忽略的,唯一例外的是_destroy属性是可以unmapped回来的,因为你从ko.observableArray里destroy一个item项的时候会生成这个属性。

mapping还有很多高级属性,如果想看的同学可以去参考api,个人认为mapping到这里已经够用了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KnockOut 2.77绿色汉化版是一款相当强大的Photoshop抠图插件KnockOut 解决了令人头疼的抠图难题,使枯燥乏味的抠图变为轻松简单的过程。Knockout 2.0不但能够满足常见的抠图需要,而且还可以对烟雾、阴影和凌乱的毛发进行精细抠图,就算是透明的物体也可以轻松抠出。即便你是Photoshop新手,也能够轻松抠出复杂的图形,而且轮廓自然、准确,完全可以满足你的需要。 Knockout 2.0特别适合用来扣透明物体,如玻璃瓶、透明杯子以及扣毛发类图像,如人物头发、动物毛发。从事平面设计的朋友都会遇到抠图的问题,边缘对比比较强烈的图片对抠图来说还比较容易,但是如果遇到像玻璃瓶、透明杯子(透明类物体)以及毛发类图像,那抠图可真让人纠结的了。虽说PS高手在PhotoShop里通过多个工具可以实现玻璃瓶、透明杯子(透明类物体)以及毛发类图像的抠图,但终究比较复杂,对菜鸟来说则更是耗时、耗力。为此,Corel公司开发了专业的抠图软件knockout,该软件连极细的毛发都能从复杂的背景中分离出来。特别是Corel knockout 2.0版本更是比knockout 1.5有了质的飞跃。利用它配合PhotoShop滤镜使用,在图像输出上会简化许多(knockout 2.0处理完后不用存盘就可直接返回Photoshop下进行编辑) 抠图教程 安装使用说明: 解压后把“KnockOut 2”文件夹复制到你photoshop安装目录的Plug-ins目录下,再运行其中的”绿化.bat”进行注册,再次启动你的photoshop就可以在滤镜菜单看见KnockOut插件了,经测试在photoshop cs以及photoshop cs5绿化版下均能正常运行,其他版本请自行测试
以下是使用Vue改写的代码: ``` <template> <div id="toolbar"> <label>Brightness:</label> <input type="range" min="0" max="2" step="0.1" v-model="brightness" /> <br> <label>Contrast:</label> <input type="range" min="0" max="2" step="0.1" v-model="contrast" /> <br> <label>Hue:</label> <input type="range" min="0" max="360" step="10" v-model="hue" /> <br> <label>Saturation:</label> <input type="range" min="0" max="2" step="0.1" v-model="saturation" /> <br> <label>Gamma:</label> <input type="range" min="0" max="2" step="0.1" v-model="gamma" /> </div> </template> <script> export default { data() { return { brightness: 1, contrast: 1, hue: 0, saturation: 1, gamma: 1 }; }, watch: { brightness(val) { this.updateLayerParameter('brightness', parseFloat(val)); }, contrast(val) { this.updateLayerParameter('contrast', parseFloat(val)); }, hue(val) { this.updateLayerParameter('hue', parseFloat(val)); }, saturation(val) { this.updateLayerParameter('saturation', parseFloat(val)); }, gamma(val) { this.updateLayerParameter('gamma', parseFloat(val)); } }, mounted() { // Make the active imagery layer a subscriber of the viewModel this.subscribeLayerParameter('brightness'); this.subscribeLayerParameter('contrast'); this.subscribeLayerParameter('hue'); this.subscribeLayerParameter('saturation'); this.subscribeLayerParameter('gamma'); }, methods: { subscribeLayerParameter(name) { this.$watch(name, function(newValue) { var layer = sceneLayer; // Replace `sceneLayer` with your actual layer object layer[name] = parseFloat(newValue); // sceneLayers[0].refresh(); // Uncomment this line if needed }); }, updateLayerParameter(name, value) { this[name] = value; } } } </script> ``` 在这个Vue组件中,我们使用了`v-model`指令来绑定滑块的值到`viewModel`对象的属性上。我们使用了Vue的`watch`方法来监听`viewModel`对象属性的变化,当属性变化时,我们调用`updateLayerParameter`方法来更新属性值。我们还使用了`mounted`方法来在组件挂载后订阅图层参数的变化。最后,我们使用了`$watch`方法来监听属性变化,并更新图层参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值