3.Knockout.Js(属性绑定)-程序员宅基地

技术标签: ViewUI  ui  json  javascript  

前言

让visible绑定到DOM元素上,使得该元素的hidden或visible取决于绑定的值。

简单的绑定

 首先还是先定义一个ViewModel 

    var AppViewModel = {
        shouldShowMessage: ko.observable(true)  ///初始化的时候div是visible的     
 }; AppViewModel.shouldShowMessage = ko.observable(false); ///现在hidden勒 ko.applyBindings( AppViewModel);

并且通过ko.applyBindins进行激活Knockout。

然后定义一个UI界面元素

<div data-bind="visible:shouldShowMessage">
    You will see this message only when "shouldShowMessage" holds a true value. </div>

运行之后此div在初始化的时候还是显示的可以,之后就被重新赋值为false,导致此div被隐藏掉了。

参数:

当参数设置为一个假值时(例如:布尔值false, 数字值0, 或者null, 或者undefined) ,该绑定将设置该元素的style.display值为none,让元素隐藏。它的优先级高于你在CSS里定义的任何display样式。

当参数设置为一个真值时(例如:布尔值true,或者非空non-null的对象或者数组) ,该绑定会删除该元素的style.display值,让元素可见。然后你在CSS里自定义的display样式将会自动生效。

如果参数是监控属性observable的,那元素的visible状态将根据参数值的变化而变化,如果不是,那元素的visible状态将只设置一次并且以后不在更新。

使用函数或者表达式来控制元素的可见性

你也可以使用JavaScript函数或者表达式作为参数。这样的话,函数或者表达式的结果将决定是否显示/隐藏这个元素。例如:

复制代码
<script type="text/javascript">
    var AppViewModel = {
        shouldShowMessage: ko.observable(true), ///初始化的时候div是visible的  myValues: ko.observableArray([]) }; AppViewModel.shouldShowMessage = ko.observable(false); ///现在hidden勒 AppViewModel.myValues.push("some value"); ///向myValues数组中 添加一个项  ko.applyBindings( AppViewModel); </script>
复制代码

在ViewModel中添加了一个myValues的属性值

同时给myValues的数组添加了一个项

并且在页面UI中绑定了一个元素

<div data-bind="visible: myValues().length > 0">    
  You will see this message only when 'myValues' has at least one member.
</div>

就这样当添加完"some value"元素之后,myValues().length>0 则结果为true 

那么此div就会显示出来。

前言

text 绑定到DOM元素上,使得该元素显示的文本值为你绑定的参数。该绑定在显示<span>或者<em>上非常有用,但是你可以用在任何元素上。

简单绑定

复制代码
Today's message is: <span data-bind="text: myMessage"></span> 

<script type="text/javascript" src="~/Scripts/knockout-2.3.0.debug.js"></script> <script type="text/javascript"> var viewModel = { myMessage: ko.observable() }; viewModel.myMessage("Hello, world!"); ko.applyBindings(viewModel); </script>
复制代码

    KO将参数值会设置在元素的innerText (IE)或textContent(Firefox和其它相似浏览器)属性上。原来的文本将会被覆盖。

    如果参数是监控属性observable的,那元素的text文本将根据参数值的变化而更新,如果不是,那元素的text文本将只设置一次并且以后不在更新。

    如果你传的是不是数字或者字符串(例如一个对象或者数组),那显示的文本将是yourParameter.toString()的等价内容。

使用函数或者表达式来决定text值

 继续在上面的ViewModel中添加一个属性,并且添加一个依赖监控属性

price: ko.observable(24.95)
    viewModel.priceRating = ko.dependentObservable(
        function () {
         return this.price() > 50 ? "expensive" : "affordable"; }, viewModel);

添加一个UI页面元素进行绑定

The item is <span data-bind="text: priceRating"></span> today.

现在,text文本将在“expensive”和“affordable”之间替换,取决于价格怎么改变。

关于HTML encoding

因为该绑定是设置元素的innerText或textContent (而不是innerHTML),所以它是安全的,没有HTML或者脚本注入的风险。例如:如果你编写如下代码:

viewModel.myMessage("<i>Hello, world!</i>");

 它不会显示斜体字,而是原样输出标签。如果你需要显示HTML内容,请参考html绑定.

关于IE 6的白空格whitespace

IE6有个奇怪的问题,如果 span里有空格的话,它将自动变成一个空的span。如果你想编写如下的代码的话,那Knockout将不起任何作用:

Html绑定

html绑定到DOM元素上,使得该元素显示的HTML值为你绑定的参数。如果在你的view model里声明HTML标记并且render的话,那非常有用。

简单示例

复制代码
<div data-bind="html: details"></div> 
<script type="text/javascript"> var viewModel = { details: ko.observable() }; ko.applyBindings(viewModel); viewModel.details("<em>For further details, view the report <a href='report.html'>here</a>.</em>"); </script>
复制代码

这样Html 的EM标签就会显示于此

KO设置该参数值到元素的innerHTML属性上,元素之前的内容将被覆盖。

如果参数是监控属性observable的,那元素的内容将根据参数值的变化而更新,如果不是,那元素的内容将只设置一次并且以后不在更新。

如果你传的是不是数字或者字符串(例如一个对象或者数组),那显示的文本将是yourParameter.toString()的等价内容。

关于HTML encoding

 因为该绑定设置元素的innerHTML,你应该注意不要使用不安全的HTML代码,因为有可能引起脚本注入攻击。如果你不确信是否安全(比如显 示用户输入的内容),那你应该使用text绑定,因为这个绑定只是设置元素的text 值innerText和textContent。

Css绑定

 css绑定是添加或删除一个或多个CSS class到DOM元素上。 非常有用,比如当数字变成负数时高亮显示。(注:如果你不想应用CSS class而是想引用style属性的话,请参考style绑定。)

简单示例

<p style="background: gray; color: #ffffff; font-size: 18pt;">Html绑定</p>
复制代码
<script type="text/javascript">   
    var viewModel = {        
        details: ko.observable(),
        currentProfit: ko.observable(150000) }; ko.applyBindings(viewModel); viewModel.currentProfit(-50); viewModel.details("<em>For further details, view the report <a href='report.html'>here</a>.</em>"); </script> 
复制代码

运行后的效果为

记得还写了一个css样式

.profitWarning {
    color: red;
}

 该参数是一个JavaScript对象,属性是你的CSS class名称,值是比较用的true或false,用来决定是否应该使用这个CSS class。

  你可以一次设置多个CSS class。例如,如果你的view model有一个叫isServre的属性,

<div data-bind="css: { profitWarning: currentProfit() < 0, majorHighlight: isSevere }">

   如果参数是监控属性observable的,那随着值的变化将会自动添加或者删除该元素上的CSS class。如果不是,那CSS class将会只添加或者删除一次并且以后不在更新。

    你可以使用任何JavaScript表达式或函数作为参数。KO将用它的执行结果来决定是否应用或删除CSS class。

应用的CSS class的名字不是合法的JavaScript变量命名

如果你想使用my-class class,你不能写成这样:

<div data-bind="css: { my-class: someValue }">...</div>

 因为my-class不是一个合法的命名。解决方案是:在my-class两边加引号作为一个字符串使用。这是一个合法的JavaScript 对象 文字(从JSON技术规格说明来说,你任何时候都应该这样使用,虽然不是必须的)。例如

<div data-bind="css: { 'my-class': someValue }">...</div>

 

Style绑定

style绑定是添加或删除一个或多个DOM元素上的style值。比如当数字变成负数时高亮显示,或者根据数字显示对应宽度的Bar。(注:如果你不是应用style值而是应用CSS class的话,请参考CSS绑定。)

Style简单示例

 

复制代码
<div data-bind="style: { color: currentProfit() < 0 ? 'red' : 'black' }">
       Profit Information
</div>
<script type="text/javascript" src="~/Scripts/knockout-2.3.0.debug.js"></script> <script type="text/javascript"> var viewModel = { currentProfit:ko.observable(15000) }; viewModel.currentProfit(-50); ko.applyBindings(viewModel); </script>
复制代码

简单示例代码,运行后发现为红色的字体

当currentProfit 小于0的时候div的style.color是红色,大于的话是黑色。

该参数是一个JavaScript对象,属性是你的style的名称,值是该style需要应用的值。

你可以一次设置多个style值。例如,如果你的view model有一个叫isServre的属性,

<div data-bind="style: { color: currentProfit() < 0 ? 'red' : 'black', fontWeight: isSevere() ? 'bold' : '' }">...</div>

如果参数是监控属性observable的,那随着值的变化将会自动添加或者删除该元素上的style值。如果不是,那style值将会只应用一次并且以后不在更新。

你可以使用任何JavaScript表达式或函数作为参数。KO将用它的执行结果来决定是否应用或删除style值。

应用的style的名字不是合法的JavaScript变量命名

 如果你需要应用font-weight或者text-decoration,你不能直接使用,而是要使用style对应的JavaScript名称。

  错误: { font-weight: someValue };            正确: { fontWeight: someValue }

    错误: { text-decoration: someValue };      正确: { textDecoration: someValue }

参考:style名称和对应的JavaScript 名称列表

attr绑定

attr 绑定提供了一种方式可以设置DOM元素的任何属性值。你可以设置img的src属性,连接的href属性。使用绑定,当模型属性改变的时候,它会自动更新。

attr绑定简单示例

 

复制代码
<a data-bind="attr: { href: url, title: details }">    Report</a>
<script type="text/javascript"> var viewModel = { url: ko.observable("year-end.html"), details: ko.observable("Report including final year-end statistics") }; ko.applyBindings(viewModel); </script>
复制代码

运行后效果为

呈现结果是该连接的href属性被设置为year-end.html, title属性被设置为Report including final year-end statistics

该参数是一个JavaScript对象,属性是你的attribute名称,值是该attribute需要应用的值。

如果参数是监控属性observable的,那随着值的变化将会自动添加或者删除该元素上的attribute值。如果不是,那attribute值将会只应用一次并且以后不在更新。

应用的属性名字不是合法的JavaScript变量命名

如果你要用的属性名称是data-something的话,你不能这样写:

<div data-bind="attr: { data-something: someValue }">...</div>

 因为data-something 不是一个合法的命名。解决方案是:在data-something两边加引号作为一个字符串使用。这是一个合法的JavaScript 对象 文字(从JSON技术规格说明来说,你任何时候都应该这样使用,虽然不是必须的)。例如

<div data-bind="attr: { ‘data-something’: someValue }">...</div>

转载于:https://www.cnblogs.com/TF12138/p/4156898.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33923762/article/details/94042878

智能推荐

基于STM32构建EtherCAT主站(SOEM方案) 基于stm32和soem的EtherCAT主站代码 基于嵌入式平台的EtherCAT主站实现研究_stm32 ethercat_「已注销」的博客-程序员宅基地

最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此改一下osal、oshw、nicdrv这几部分的代码就可以了。当然了,移植过程中参考了许多网上资料(不限于以下几个)。在_stm32 ethercat

ruby 保留两位小数_Ruby中的保留字/关键字_cunfen6312的博客-程序员宅基地

ruby 保留两位小数 Ruby中的保留字/关键字 (Reserved Words/Keywords in Ruby)There are certain words that are reserved for doing specific tasks. These words are known as keywords and they have standard, predefined me...

笔记本电脑的触摸区域操作_笔记本电脑滑动区域使用技巧_ASxiaobai的博客-程序员宅基地

大家可能还不知道笔记本电脑触摸区域的神奇之处,完全可以不用鼠标操作电脑!1、一只手指滑动,可以控制光标,相当于鼠标在桌子上移动;一只手指点,相当于点鼠标左键,即确定。2、两只手指滑动,相当于鼠标滚轮,两只手指同时向上滑,即屏幕向上滑动,向下滑,即屏幕向下滑动。3、..._笔记本电脑滑动区域使用技巧

Linux执行crontab计划任务,定时执行脚本或命令_flock -xn /tmp/stargate.lock -c_梦境工程师-335的博客-程序员宅基地

一、cron的作用按照设置的时间间隔为用户反复执行某一项固定的系统任务二、cron的操作命令查看:crontab -l [-u 用户名]编辑:crontab -e [-u 用户名]清除: crontab -r [-u 用户名](1)查看命令>>>crontab -l root7127@1106:~$ sudo crontab -l -u root*/1 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud_flock -xn /tmp/stargate.lock -c

freeswitch通过RTSP协议接入网络摄像头_feeeswitch 对接摄像机-程序员宅基地

freeswitch的vlc模块也支持连接摄像头,可以为啥还要开发一个呢,原因是vlc模块中对摄像头的视频做了编解码,cpu占用率非常高,并且视频不流畅,卡顿严重。 因此,我在freeswitch中增加了一个模块,连接摄像头时,该模块会作为一个客户端连接摄像头。走完一遍RTSP协议后,摄像头的视频流就直接进入到了fs,中间不做转码。 经过测..._feeeswitch 对接摄像机

Visual Studio怎么加入jQuery程序包_visual studio怎么引用jq-程序员宅基地

使用jQuery必须要有jQuery程序包。有些同学一直在网上下载很麻烦,其实在VS中可以直接下载程序包。(博主用的是VS2015)今天就教大家怎么直接在VS中下载。首先打开VS,在自己的项目上右键选择管理NuGet程序包点击后出现以下内容点击jQuery后出现在版本中选择你想用的版本,一般来说版本越低兼容的Jquery代码越好,具体视自己的项目而定。..._visual studio怎么引用jq

随便推点

Cadence off-page 批量修改_candance批量编辑off page connector网络名称-程序员宅基地

复制 Ctrl+Insert粘贴 Shift+Insert_candance批量编辑off page connector网络名称

Java易错知识点-程序员宅基地

也学了一段时间的Java了,本来觉得虽然学得不是太好,但也不会太差吧,结果一个小测验将自己打回原形,基础还是不牢固,总结下自己碰到的易错点吧。 Java源文件经过编译,转换生成字节码文件然后再传入JVM经过解释器转换成机器语言,但是,源文件转换成机器语言的方式称为为编译方式!Java注释: 单行注释 //注释文本 多行注释 /*注释文本*/

aagagag-程序员宅基地

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;head id="ctl00_ctl._ubmmhl

nrm切换npm源利器-程序员宅基地

在使用npm时,官方的源下载npm包会比较慢,国内我们基本使用淘宝的源,最近公司内部搭建了一套npm私有仓库。要添加自己公司内部的npm源,公司内部的源不可能把npm官方的npm包都全量同步,故需要npm源之间的切换,如果使用npm registry xxx的话,太不好管理了。nrm是管理npm源切换的利器。使用方法如下:安装nrmnpm install -g nrm 主要使用ls和u...

Miniconda3或Anaconda3安装到指定目录_miniconda3 新环境的目录-程序员宅基地

chmod +x Mixxxxxxxxxx.sh或Aancondaxxxxxxx.sh./Anacondaxxxxxxxxxx.sh -f -b -p /testing/anaconda3安装完成之后便可以使用conda命令了Miniconda所有版本的位置:https://repo.continuum.io/miniconda/Miniconda3-4.5.4-Linu..._miniconda3 新环境的目录

ABAQUS软件实训(五):Mesh模块之二合一(三合一)网格划分技巧_abaqus如何进行网格合并_是刃小木啦~的博客-程序员宅基地

什么是二合一?对于上图所示的节点数,叫做二合一,对于这种情况的网格划分,会是这样的:这里用abaqus来实际展示:进行网格划分:三合一也是类似的:对于一些网格点数不对应的情况,可以选择二合一或者三合一。既不是2的倍数,也不是三的倍数,可以进行组合,例如:10=2*2+2*3至于为什么要使用二合一和三合一,是为了网格划分时尽可能出现四边形,尽可能不要出现三角形,如果在一些不可避免出现三角形的情况下,可以使用这种方法来凑。正如题目说的,这算..._abaqus如何进行网格合并