zoukankan      html  css  js  c++  java
  • Knockoutjs属性绑定(Bindings)之控制文本和外观(Controlling text and appearance)

    上次我们通过《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

  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/wukong65/p/2792285.html
Copyright © 2011-2022 走看看