上次我们通过《Knockoutjs实战开发:属性监控(Observables)和依赖跟踪(Dependency tracking )》一文对Knockoutjs的属性监控有了初步的了解,在昨天的文章中我们只是对某个属性进行监控介绍,在Knockoutjs中也提供了数组的监控,下面我们首先对数组的监控作下介绍,然后再开始介绍Knockoutjs的属性绑定的控制文本和外观。
一、数组监控(Observable Arrays)
如果我们想要使用Knockoutjs表示多个值的话我们可以使用数组监控(Observable Arrays)来表示,形式如下:
1 var myObservableArray = ko.observableArray(); 2 myObservableArray.push('Some value');
在第一行我们实例化了一个数组,在第二行我们向此数组中添加了一条记录,正如我们看到的那样,往数组中添加数组我们使用push方法。当然我们也可以在初始化数组的时候为其赋初值,代码如下:
1 var anotherObservableArray = ko.observableArray([ 2 { name: "Bungle", type: "Bear" }, 3 { name: "George", type: "Hippo" }, 4 { name: "Zippy", type: "Unknown" } 5 ]);
以上的代码我们在定义一个数组的同时为其赋了初值,这样我们就可以通过以下的方法进行数组的访问了:
1 alert('The length of the array is ' + myObservableArray().length); 2 alert('The first element is ' + myObservableArray()[0]);
在第一行的代码中我们使用了数组的length属性来求得数组的长度,在第二行的代码中我们取得了数组的第一个值。
Knockoutjs数组常用的方法如下:
(1)、myObservableArray.push('Some new value')
:增加一个新的元素
(2)、myObservableArray.pop()
:删除一个元素,并返回其值
(3)、myObservableArray.unshift('Some new value')
:在数组的开始处增加一个新的元素
(4)、myObservableArray.shift()
:删除数组的第一个元素,并返回其值
(5)、myObservableArray.reverse()
:反转数组的顺序
(6)、myObservableArray.sort()
:数组排序。排序规则可以由用户自己定义也可以使用默认,默认情况下按照字母顺序或者数字的顺序进行排序。自己定义排序规则时需要接收数组 中的两个元素,并且需要返回一个数值,当此值小于0时表示第一个元素较小,当此值大于0时,表示第二个元素较小,当等于0时表示两个元素相等。示例如下:
1 myObservableArray.sort(function(left, right) { return left.lastName == right.lastName ? 0 : (left.lastName < right.lastName ? -1 : 1) })
(7)、myObservableArray.splice()
:数组截取。例如:myObservableArray.splice(1, 3)
,代表从数组的第一个元素开始,截取三个元素,并且将他们作为数组返回。
二、控制文本和外观(Controlling text and appearance)
(1)、Visible
binding
此绑定可以控制某个控件或者内容什么时候该显示,什么时候不该显示。比如:
1 <div data-bind="visible: shouldShowMessage"> 2 You will see this message only when "shouldShowMessage" holds a true value. 3 </div> 4 5 <script type="text/javascript"> 6 var viewModel = { 7 shouldShowMessage: ko.observable(true) 8 }; 9 viewModel.shouldShowMessage(false); 10 viewModel.shouldShowMessage(true); 11 ko.applyBindings(viewModel); 12 </script>
当shouldShowMessage为true时会显示div的文本,反则不显示。并且当shouldShowMessage的值改变时,div的显示与否也会自动的改变。我们也可以使用方法来控制此组件是否显示:
1 <div data-bind="visible: myValues().length > 0"> 2 You will see this message only when 'myValues' has at least one member. 3 </div> 4 5 <script type="text/javascript"> 6 var viewModel = { 7 myValues: ko.observableArray([]) // Initially empty, so message hidden 8 }; 9 viewModel.myValues.push("some value"); // Now visible 10 ko.applyBindings(viewModel); 11 </script>
上例通过数组myValues的大小来控制div组件是否显示,当长度大于0时div中的内容才会加以显示,否则不会显示。
(2)、text binding
文本绑定我们在前面一直在用,这里我们再看一下他的代码:
1 Today's message is: <span data-bind="text: myMessage"></span> 2 3 <script type="text/javascript"> 4 var viewModel = { 5 myMessage: ko.observable() // Initially blank 6 }; 7 viewModel.myMessage("Hello, world!"); // Text appears 8 ko.applyBindings(viewModel); 9 </script>
此处使用text binding来控制span中的文本内容。当然我们在使用text binding时也可以绑定组合属性的,代码如下:
1 The item is <span data-bind="text: priceRating"></span> today. 2 3 <script type="text/javascript"> 4 var viewModel = { 5 price: ko.observable(24.95) 6 }; 7 viewModel.priceRating = ko.computed(function() { 8 return this.price() > 50 ? "expensive" : "affordable"; 9 }, viewModel); 10 ko.applyBindings(viewModel); 11 </script>
此处将组合属性priceRating绑定到了span上并加以显示逻辑可以使用以下代码替换:
1 The item is <span data-bind="text: price() > 50 ? 'expensive' : 'affordable'"></span> today.
将逻辑判断放到data-bind中进行,少定义了组合属性priceRating。
(3)、HTML Binding
此功能类似我们的innerHTML功能。代码如下:
<div data-bind="html: details"></div> <script type="text/javascript"> var viewModel = { details: ko.observable() // Initially blank }; viewModel.details("<em>For further details, view the report <a href='report.html'>here</a>.</em>"); // HTML content appears ko.applyBindings(viewModel); </script>
但是我们应尽量减少这样的代码,因为这样可能会出现相应的注入,如果非要使用不可的话,一定要在使用之前对输入的内容加以验证。
(4)、CSS Bindings
使用此功能我们可以为我们的组件加上相应的CSS。
1 <div data-bind="css: { profitWarning: currentProfit() < 0 }"> 2 Profit Information 3 </div> 4 5 <script type="text/javascript"> 6 var viewModel = { 7 currentProfit: ko.observable(150000) // Positive value, so initially we don't apply the "profitWarning" class 8 }; 9 viewModel.currentProfit(-50); // Causes the "profitWarning" class to be applied 10 ko.applyBindings(viewModel); 11 </script>
(5)、style bindings
使用此功能可以为我们的组件加入相应的style。
1 <div data-bind="style: { color: currentProfit() < 0 ? 'red' : 'black' }"> 2 Profit Information 3 </div> 4 5 <script type="text/javascript"> 6 var viewModel = { 7 currentProfit: ko.observable(150000) // Positive value, so initially black 8 }; 9 viewModel.currentProfit(-50); // Causes the DIV's contents to go red 10 ko.applyBindings(viewModel); 11 </script>
(6)、attr bindings
使用此功能可以为相应组件增加对应的属性,比如为<a></a>标签加入href和title等属性:
1 <a data-bind="attr: { href: url, title: details }"> 2 Report 3 </a> 4 5 <script type="text/javascript"> 6 var viewModel = { 7 url: ko.observable("year-end.html"), 8 details: ko.observable("Report including final year-end statistics") 9 }; 10 ko.applyBindings(viewModel); 11 </script>
以上示例代码来源于:www.knockoutjs.com