顯示具有 knockoutjs 標籤的文章。 顯示所有文章
顯示具有 knockoutjs 標籤的文章。 顯示所有文章

2012年9月18日 星期二

Knockoutjs 18-2 Click Binding

Knockoutjs Click Binding

example 帶有引入參入的click handel:

<!DOCTYPE html>
<html>
<head>
<title>click Binding</title>
<meta charset="UTF-8"/>
<style>
*{
margin: 0px 0px 0px 0px;
}
.cube{
text-align: center;
width: 150px;
height:150px;
line-height: 150px;
background-color:#0000FF; /* color is blue*/
color:#FFFFFF;            /* font color is white*/
font-size: 2em;
font-weight: bold;        /*粗體*/
}
</style>
</head>
<body>
<script src="../lib/knockout-2.1.0.js"></script>
<script>
(function(window , undefined ){
var ko = window.ko,
   manager = window.manager || {};

manager.viewModel = {
colors:ko.observableArray(['darkgreen','darkgrey','darkmagenta','darkorange']),
colorIndex:-1,
changeColor:function(data , event){
//被點擊的項目可由event取回
//若需改變其他DOM,則需在init時將需改變的DOM參照記錄於viewModel中
(data.colorIndex >= data.colors().length-1 && (data.colorIndex = -1));
event.srcElement.style.backgroundColor = data.colors()[++data.colorIndex] ;
},
controlName:'Click Me'
};
 
window.manager = manager;  
})(window);

window.onload = function(){
ko.applyBindings( manager.viewModel);
};  
</script>
<div class="cube" id="myCube" data-bind="click:changeColor , text:controlName"></div>
</body>
</html>

參考資料:knockoutjs官方文件

2012年9月17日 星期一

Knockoutjs 18-1 Click Bindig

Knockoutjs Click Binding

example 1:
<!DOCTYPE html>
<html>
<head>
<title>click Binding</title>
<meta charset="UTF-8"/>
<style>
*{
margin: 0px 0px 0px 0px;
}
.cube{
width: 100px;
height:100px;
background-color:#0000FF; /**bule*/
}
</style>
</head>
<body>
<script src="../lib/knockout-2.1.0.js"></script>
<script>
(function(window , undefined ){
var ko = window.ko,
   manager = window.manager || {};

manager.viewModel = {
colorControl:{
//property
redControlName:ko.observable('紅色'),
greenControlName:ko.observable('綠色'),
//method
changeColorByRed:function(){
document.getElementById('myCube').style.backgroundColor = '#FF0000';
},
changeColorByGreen:function(){
document.getElementById('myCube').style.backgroundColor = '#00FF00';
}
}
};
 window.manager = manager;
})(window);

window.onload = function(){
ko.applyBindings( manager.viewModel);
};  
</script>
<div class="cube" id="myCube"></div>
<div data-bind="with:colorControl">
<input type="button" data-bind="click:changeColorByRed , value:redControlName"></button>
<input type="button" data-bind="click:changeColorByGreen , value:greenControlName"></button>
</div>
</body>
</html>

結果:

click前












按下紅色:












按下綠色:













第一種就是非物件觀念的寫法,只是為了把功能寫出來。


接下來同樣程式使用不同概念撰寫結構:
example2:
<!DOCTYPE html>
<html>
<head>
<title>click Binding</title>
<meta charset="UTF-8"/>
<style>
*{
margin0px 0px 0px 0px;
}
.cube{
width100px;
height:100px;
background-color:#0000FF/**bule*/
}
</style>
</head>
<body>
<script src="../lib/knockout-2.1.0.js"></script>
<script>
(function(window , undefined ){
var ko = window.ko,
   manager = window.manager || {};
   
manager.viewModel = {
//陣列ko
colorControls: ko.observableArray([{
//property
controlName:ko.observable('紅色'),
//method
changeColor:function(){
document.getElementById('myCube').style.backgroundColor = '#FF0000';
}
},{
//property
controlName:ko.observable('綠色'),
//method
changeColor:function(){
document.getElementById('myCube').style.backgroundColor = '#00FF00';
}
}
])
};
 window.manager = manager;
})(window);

window.onload = function(){
ko.applyBindings( manager.viewModel);
};  
</script>
<div class="cube" id="myCube"></div>
<div data-bind="foreach:colorControls">
<input type="button" data-bind="click:changeColor , value:controlName"></button>
</div>
</body>
</html>

example2具有物件開發觀念,在意義上不需再new一次,書本或網路文章都可找到使用new不直覺且效能上較不好一點,但文章吸收完還得活用,你可以想若是這個項目非常多時,開發者要打很多字且都是非常相像的程式碼。


再來這是另一種方法:

example3:

<!DOCTYPE html>
<html>
<head>
<title>click Binding</title>
<meta charset="UTF-8"/>
<style>
*{
margin0px 0px 0px 0px;
}
.cube{
width100px;
height:100px;
background-color:#0000FF/**bule*/
}
</style>
</head>
<body>
<script src="../lib/knockout-2.1.0.js"></script>
<script>
(function(window , undefined ){
var ko = window.ko,
   manager = window.manager || {};

function ColorControl(colorName , colorValue , target){
this.controlName = colorName;
this.colorValue = colorValue;
this.target = target;
};

ColorControl.prototype.changeColor = function(){
this.target.style.backgroundColor = this.colorValue; 
};

manager.viewModel = {
colorControls: ko.observableArray([])
};
 
manager.init = function(){
manager.viewModel.colorControls.push(
     new ColorControl("紅色","#FF0000",document.getElementById('myCube'))
   );
manager.viewModel.colorControls.push(
     new ColorControl("綠色", "#00FF00",document.getElementById('myCube'))
   );
};
 
 
window.manager = manager;  
})(window);

window.onload = function(){
manager.init();
ko.applyBindings( manager.viewModel);
};  
</script>
<div class="cube" id="myCube"></div>
<div data-bind="foreach:colorControls">
<input type="button" data-bind="click:changeColor , value:controlName"></button>
</div>
</body>
</html>
總之對於程式編成還有非常多不懂,再往前進後也許又會發現現在自己所想的是錯誤的, 前輩說見山是山,見山又不是山。

2012年8月25日 星期六

knockoutjs 17 if binding

knockoutjs if binding
example1:
<!DOCTYPE html>
<html>
<head>
<title>if binding example</title>
<meta charset="UTF-8"/>
<script src="../lib/jquery-1.7.1.min.js"></script>
<script src="../lib/knockout-2.1.0.js"></script>
<script>
$(document).ready(function(){
ko.applyBindings({displayMessage: ko.observable(false)});
});
</script>
</head>
<body>
<!--if binding,當displayMessage為true時,其DIV內容文字顯現-->

<div data-bind="if: displayMessage">Here is a message. Astonishing.</div>
<input type="checkbox" data-bind="checked: displayMessage" /> Display message
</body>
</html>

說明:
hide (displayMessage value is false):   
   <body>
   <div data-bind="if: displayMessage"></div>
   <input type="checkbox" data-bind="checked: displayMessage"> Display message
   </body>
  • note:注意div內容將為空,div依然存在於DOM中,但內容文字不會存在,如果是visible bind即使處在hide但其內容文字依然存在於DOM中。
show (displayMessage value is true):
  <body>
  <div data-bind="if: displayMessage">Here is a message. Astonishing.</div>
  <input type="checkbox" data-bind="checked: displayMessage"> Display message
  </body>

  • if binding 會直接對DOM elements 的內容操作,會直接將內容移除。
  • visible是使用CSS display:none 來隱藏,visible的隱藏DOM elements中的內容依然會存在。

example 2:

<!DOCTYPE html>
<html>
<title>if binding example</title>
<meta charset="UTF-8"/>
<script src="../lib/knockout-2.1.0.js"></script>
</head>
<body>
    <div data-bind="if: show">Here is a message. 一</div>
    <div data-bind="if: hide">Here is a message. 二</div>
    <div data-bind="if: show">Here is a message. 三</div>
    <script>
       function ViewModle() {
           this.show = ko.observable(true);
           this.hide = ko.observable(false);
       }
       ko.applyBindings(new ViewModle());
    </script>
</body>
</html><head>

結果:

Here is a message. 一
Here is a message. 三

example3:
<!DOCTYPE html>
<html>
<head>
<title>if Binding</title>
<meta charset="UTF-8"/>
<script src="../lib/jquery-1.7.1.min.js"></script>
<script src="../lib/knockout-2.1.0.js"></script>
<script>
$(document).ready(function(){
    function ViewModel(){
   this.planets = [
            {name: 'Mercury', capital: null },
            {name: 'Earth', capital: { cityName: 'Barnsley' }}
]; 
}
ko.applyBindings(new ViewModel());
});
</script>
</head>
<body> <!--這裡使用foreach binding,將與ViewModel中的planets繫結,
    將會迭代planets陣列,依其長度重複ul中的內容結構-->

<ul data-bind="foreach: planets">
    <li>
        <!--這裡使用text binding,將與ViewModel中的name繫結-->
        Planet: <b data-bind="text: name"></b>
        <!--這裡使用if binding,將與ViewModel中的 capital 繫結-->
        <div data-bind="if: capital">        <!--這裡使用text binding,因為父層DIV沒有使用with繫結,所以要依物件結構呼叫繫結目標-->
            Capital: <b data-bind="text: capital.cityName"></b>
        </div>
    </li>
</ul>
</body>
</html>

結果:
  • Planet: Mercury
  • Planet: Earth
    Capital: Barnsley
HTML 原始碼內容: 

<body>
<ul data-bind="foreach: planets">
    <li>
        Planet: <b data-bind="text: name">Mercury</b>
        <div data-bind="if: capital"></div>  <-DOM存在,其內容文字不存在。
    </li>

    <li>
        Planet: <b data-bind="text: name">Earth</b>
        <div data-bind="if: capital">                                  
            Capital: <b data-bind="text: capital.cityName">Barnsley</b>
        </div>                                                         
    </li>
</ul>
</body>

note: if bind的繫結屬性若為nullundefined0則都視為false.


example4 使用xml 註解方式操作 if bind:
  • 注意程式碼中紅色註解為knockoutjs框架中所使用的xml註解宣告binding。
<!DOCTYPE html>
<html>
<head>
<title>if Binding</title>
<meta charset="UTF-8"/>     
<script src="../lib/jquery-1.7.1.min.js"></script>
<script src="../lib/knockout-2.1.0.js"></script>
<script>            
$(document).ready(function(){   
    function ViewModel(){
        this.planets = [
            {name: 'Mercury', capital: null },
            {name: 'Earth', capital: { cityName: 'Barnsley' }}
        ]; 
    }                       
    ko.applyBindings(new ViewModel());
}); 
</script>
</head>
<body>      
<ul data-bind="foreach: planets">
    <li>
        Planet: <b data-bind="text: name"></b>
         <!-- ko if: capital -->
        <div>
            Capital: <b data-bind="text: capital.cityName"></b>
        </div>
        <!-- /ko -->
    </li>
</ul>   
</body>
</html>

結果:
  • Planet: Mercury
  • Planet: Earth
  • Capital: Barnsley
輸出畫面上雖然看起來一樣但是,若使用chrome檢查原素可見如下:

 HTML 原始碼內容:

  • 使用註解標籤方式的if binding 整各DOM elements會是不存在的。


<body>      
<ul data-bind="foreach: planets">
    <li>
        Planet: <b data-bind="text: name">Mercury</b>
         <!-- ko if: capital --><!-- /ko -->  <-注意DIV將不存在,陣列中第一筆capital為null。
    </li>

    <li>
        Planet: <b data-bind="text: name">Earth</b>
        <!-- ko if: capital --> <-內容生成,因為陣列中第二筆資料的capital存在。
        <div>                                                          
            Capital: <b data-bind="text: capital.cityName">Barnsley</b>
        </div>                                                         
        <!-- /ko -->
    </li>
</ul>
</body>