zoukankan      html  css  js  c++  java
  • knockout.js

    看博客:https://www.zhihu.com/question/27791075 

    1.简答的应用:

    html

    --------------------------------------------------

    <div id="content1">
    userName:<input type="text" id="useNameText" value="inputValue" data-bind="value:UserName" />
    <p>
    hello <b id="userNameView" data-bind="html:UserName" >inputValue</b>
    </p>
    <p>
    hello <b id="userNameAgainView" data-bind="html:UserName" >inputValue</b> again
    </p>
    </div>

    Js

    --------------------------------------------------

    var ViewModel = function(){
    var self = this;
    self.UserName = ko.observable("");
    }

    var currentViewModel = new ViewModel();
    ko.applyBindings(currentViewModel);

    2.数组类型双向数据的绑定

    <select id="userNameList" data-bind="options:userNames,selectedOptions:selectedUserName">
    </select>

    <b id="selectValue" data-bind="html:selectedUserName"></b>

    var ViewModel = function(){
    var self = this;
    self.userNames = ko.observableArray(["tom","jerry","david"]);
    self.selectedUserName = ko.observable();
    };
    var currentViewModel = new ViewModel();
    ko.applyBindings(currentViewModel);

    3.循环绑定

    <div id="content1">
    <table>
    <thead>
    <tr>
    <th>id</th>
    <th>英文名</th>
    <th>中文名</th>
    <th>描述</th>
    </tr>
    </thead>
    <tbody id="tableBody" data-bind="foreach:Planets" >
    <tr>
    <td data-bind="html:$index"></td>
    <td data-bind="html:englishName"></td>
    <td data-bind="html:chineseName"></td>
    <td data-bind="html:description"></td>
    </tr>
    </tbody>
    </table>
    </div>

    var Planets = [
    {id:1,englishName:"Mercury",chineseName:"水星",description:"离太阳最近的一颗行星"},
    {id:2,englishName:"Venus",chineseName:"金星",description:"拥有非常厚的大气层的一颗行星"},
    {id:3,englishName:"Earth",chineseName:"地球",description:"我们的家园"},
    {id:4,englishName:"Mars",chineseName:"火星",description:"一颗红色的星球"},
    {id:5,englishName:"Jupiter",chineseName:"木星",description:"太阳系最大的行星"},
    {id:6,englishName:"Saturn",chineseName:"土星",description:"拥有最美丽光环的行星"},
    {id:7,englishName:"Uranus",chineseName:"天王星",description:"内核是个巨大的海洋(8000千米)"},
    {id:8,englishName:"Neptune",chineseName:"海王星",description:"一颗优雅的淡蓝色行星"},
    {id:9,englishName:"Pluto",chineseName:"冥王星",description:"曾经是行星的行星"}
    ];

    var ViewModel = function(){
    var self = this;
    self.Planets = ko.observableArray(Planets);
    self.newPlanet = function(){
    self.Planets.push({id:10,englishName:"unknow",chineseName:"未知行星",description:"等待人类去发现"});
    return false;
    }
    };
    var currentViewModel = new ViewModel();
    ko.applyBindings(currentViewModel);

    4.  组合类型数据绑定的使用

    <div id="content1">
    Year:<input data-bind="value:Year"><br/>
    Month:<input data-bind="value:Month"><br/>
    Day:<input data-bind="value:Day"><br/>
    Date:<span data-bind="html: Date " ></span><br/>
    <input data-bind="value:Date" />
    </div>

    var ViewModel = function(){
    var self = this;
    self.Year = ko.observable("");
    self.Month = ko.observable("");
    self.Day = ko.observable("");

    self.Date = ko.pureComputed({
        write: function(value){
          var indexOfYear = value.indexOf('年');
          var indexOfMonth=value.indexOf('月');
          var indexOfDay=value.indexOf('日');
          self.Year(value.substring(0,indexOfYear));
          self.Month(value.substring(indexOfYear+1,indexOfMonth));
          self.Day(value.substring(indexOfMonth+1,indexOfDay));
      },
      read: function(){
        return self.Year()+'年'+self.Month()+'月'+self.Day()+'日';
       },
       owner:self
    });
    };
    var currentViewModel = new ViewModel();
    ko.applyBindings(currentViewModel);

    5.knockout中各种事件的绑定

    <div id="content1">
    <b id="countView" data-bind="html:CurrentIndex,style:{color:IndexColor}">0</b><br/>
    <input type="button" value="点击" id="countButton" data-bind="event:{click:CounterAdd,mouseover:CounterOver,mouseout:CounterOut}">
    </div>

    var ViewModel = function(){
    var self = this;
    self.CurrentIndex = ko.observable(0);
    self.CounterAdd= function(){
    var currentIndex = self.CurrentIndex();
    currentIndex=currentIndex+1;
    self.CurrentIndex(currentIndex);
    }
    self.IndexColor = ko.observable("black");
    self.CounterOver=function(){
    self.IndexColor("red");
    };
    self.CounterOut=function(){
    self.IndexColor("black");
    };
    };
    var currentViewModel = new ViewModel();
    ko.applyBindings(currentViewModel);

    6.定义组件,避免重复造轮子

    <div data-bind="component:'MessagerAndList'"></div>

    <div data-bind="component:{name:'MessagerAndList',params:'jerry'}"></div>

    ko.components.register(
    'MessagerAndList',{
    viewModel:function(){
    var self = this;
    self.Account = ko.observable(para);

    self.Account = ko.observable(params!=null?params:"bob");
    self.MessageText = ko.observable("");
    self.Send = function(){
    self.MessageList.push({message:self.MessageText(),account:self.Account()});
    self.MessageText("");
    }
    self.MessageList = ko.observableArray([]);
    },
    template:'<input type="text" data-bind="value:MessageText" /><button id="Send" data-bind="click:Send" >发送</button><ul data-bind="foreach:MessageList"><li><p data-bind="html:message">文本内容1</p><b data-bind="html:account"></b></li></ul>'
    }
    );
    ko.applyBindings();

    7.

    <div><label>地址:</label>
    <select data-bind="options:CityList,optionsText:'Name',optionsValue:'Code',value:City,optionsCaption:'请选择城市'"></select>
    <select data-bind="options:CurrentAreaList,optionsText:'Name',optionsValue:'Code',value:Area,optionsCaption:'请选择区县'"></select>
    </div>

    var  ViewModel = function(){
                var self = this;
                self.Name = ko.observable("");
                self.Email = ko.observable("");
                self.City = ko.observable("");
                self.Area = ko.observable("");
                self.CityList = ko.observableArray([
                    {Name:'上海市',Code:1001},
                    {Name:'北京市',Code:1002},
                ]);
                self.AreaList = ko.observableArray([
                    {Name:'静安区',Code:1001001,CityCode:1001},
                    {Name:'徐汇区',Code:1001002,CityCode:1001},
                    {Name:'浦东区',Code:1001003,CityCode:1001},
                    {Name:'朝阳区',Code:1002001,CityCode:1002},
                    {Name:'宣武区',Code:1002002,CityCode:1002},
                    {Name:'海淀区',Code:1002003,CityCode:1002},
                    {Name:'通州区',Code:1002004,CityCode:1002}
                ]);
                self.CurrentAreaList = ko.computed(function(){
                    return ko.utils.arrayFilter(self.AreaList(),function(area){
                        return area.CityCode == self.City();
                    });
                },self);
            };

     8.错误验证(不常用)

    代码:

    <div id="content1">
        
            <form data-bind="submit:SubmitForm">
                <div><label>姓名:</label><input data-bind="value:Name"></input></div>
                <div><label>邮箱:</label><input data-bind="value:Email"></input></div>
                <div><label>地址:</label>
                    <select data-bind="options:CityList,optionsText:'Name',optionsValue:'Code',value:City,optionsCaption:'请选择城市'"></select>
                    <select data-bind="options:CurrentAreaList,optionsText:'Name',optionsValue:'Code',value:Area,optionsCaption:'请选择区县'"></select>
                </div>
                <div>
                    <label>爱好:</label>
                    <select multiple="multiple" data-bind="options:Hobbies,selectedOptions:MyHobbies"></select>
                </div>
                <div>
                    <input type="submit" value="提交" >
                </div>

                 <div class="errors">
                    <p data-bind="validationMessage:Name"></p>
                    <p data-bind="validationMessage:Email"></p>
                 </div>


    </form> </div>
    
    

    ko.validation.configure({
      registerExtenders: true,//可以添加extend的方法
      insertMessages:true,//可以在输入框的右边提示,如果false的话,那么就不能再右边显示
      errorClass:'errors'//代表
    });


    var
    ViewModel = function(){ var self = this; self.Name = ko.observable("").extend({required:{message:'请输入您的姓名'}}); self.Email = ko.observable("").extend({required:{message:'请输入您的邮箱地址'}}).extend({pattern:{message:'请输入正确的邮箱地址',params:'([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$'}}); self.SubmitForm = function(){ if(self.errors().length>0){ self.errors.showAllMessages(); return false; } else{ return true; } }; }

     如果extend后边的require:true的话,那么提示的错误信息是英文

    9.一个页面绑多个ViewModel

    <div id="content1" data-model="content1">
            请选择银行:<b data-bind="click:ShowBankList" style="cursor:pointer;">选择</b>
            <span style="color:blue;" data-bind="html:SelectedBank">
            </span>
        </div>
    
        <div id="content2" data-model="content2" >
            <div data-bind="visible:ModelVisible" >
                <select data-bind="options:Banks,value:SelectedBank">
                <select>
            </div>
        </div>
    var  currentViewModel,currentViewModelNew;
            $(document).ready(function(){
    
                currentViewModel = new ViewModel("tom");
                ko.attach("content1", currentViewModel);
    
                
                currentViewModelNew = new ViewModelBankList("jerry");
                ko.attach("content2", currentViewModelNew);
    
            });
    
            var  ViewModel = function(name){
                var self = this;
                self.Name = ko.observable(name);
                self.SelectedBank = ko.observable('');
                self.ShowBankList = function(){
                    //显示银行选择列表
                    currentViewModelNew.Init(self.SelectedBank);
                };
            };
            
            var  ViewModelBankList = function(name){
                var self = this;
                self.ModelVisible = ko.observable(false);
                self.SelectedBank = ko.observable('');
                self.Banks = ko.observableArray(['中国银行','中国建设银行','花旗银行']);
                self.Init=function(messageBank){
                    self.SelectedBank = messageBank;
                    self.ModelVisible(true);
                }
            };

     10.一个简单的demo

    <div id="content1" data-model="content1">
    
                <div style="500px;">
                    <textarea style="height:80px;100%;" data-bind="value:MessageContent,event:{'change':MessageContentChange}"></textarea>
                    <div>
                        <p style="float:left;margin:0;" >还剩<b data-bind="html:RemainCount" >0</b></p>
                        <label data-bind="visible:IsSendMessage()">发表中...</label>
                        <button style="float:right;" data-bind="visible:!IsSendMessage(),click:SendMessage">发表</button>
                        <div style="clear:both;"></div>
                    </div>
                </div>
        
                <div style="500px; margin-top:12px; border:1px solid #efefef;" data-bind="foreach:MessageList">
                
                    <div  style="border-bottom:1px dashed #eee;">
                        <span data-bind="html:Detail.Account">tom</span>
                        <p data-bind="html:Detail.Content">微博内容</p>
                        <span>发表于:<label data-bind="html:Detail.CreateTime" ></label></span>
                        <span>评论(<label data-bind="html:ReplyList.length"></label>)</span>
                    </div>
                
                
                </div>
        
        </div>
    var  MessageEntity = function(messageDetail,replyList){
                var self = this;
                self.Detail = messageDetail;
                self.ReplyList = ko.observableArray(replyList);
            }
        
            var  MessageDetailEntity = function(detail){
                var self = this;
                self.Account = detail.Account;
                console.log(detail.Content);
                self.Content = detail.Content;
                self.CreateTime = detail.CreateTime;
            }
        
            var  ReplyEntity = function(replyDetail){
                var self = this;
                self.ReplyId = replyDetail.Id;
                
                self.Content = replyDetail.Content;
                self.CreateTime = replyDetail.CreateTime;
                self.ReplyAccount = replyDetail.ReplyAccount;
            }
        
            var  currentViewModel;
            $(document).ready(function(){
                currentViewModel = new ViewModel();
                ko.attach("content1", currentViewModel);
    
            });
    
            var  ViewModel = function(){
                var self = this;
                self.MessageList = ko.observableArray();
                self.DateTime =  new Date();
                self.TimeNow =ko.observable( new Date(self.DateTime.getTime()).format("yyyy-MM-dd- hh:mm:ss"));
                self.MessageContent = ko.observable("");
                self.CurrentMessage = ko.observable(new MessageDetailEntity({Account:"tom",Content:self.MessageContent(),CreateTime:self.TimeNow()}));
                self.IsSendMessage=ko.observable(false);
                self.HasNewMessage = ko.observable(false);
                self.RemainCount = ko.observable(0);
                
                self.MessageContentChange = function(){
                    var  currentCount = self.MessageContent().length;
                    self.RemainCount(140-currentCount);
                }
                
                self.SendMessage = function(){
                    self.IsSendMessage(true);
                    //AJAX POST DATA TO SERVER
                    var messageEntity = new MessageEntity(new MessageDetailEntity({Account:"tom",Content:self.MessageContent(),CreateTime:self.TimeNow()}),[]);
                    self.MessageList.push(messageEntity);
                    self.IsSendMessage(false);
                };
            };
  • 相关阅读:
    spring mvc DispatcherServlet详解之一---处理请求深入解析
    spring mvc DispatcherServlet详解之前传---前端控制器架构
    [推荐]趣味剖析Spring5核心原理
    源码揭秘mybatis日志实现的原理
    mybatis返回自增主键踩坑记
    根据身份证号码判定原籍地的方法
    深入源码解析spring aop实现的三个过程
    匆忙--一个大龄十年老程序员战战兢兢的应对中年危机的2019年总结与2020年展望
    Java 趟坑录
    迷你MVVM框架 avalonjs1.5 入门教程
  • 原文地址:https://www.cnblogs.com/coding4/p/6373376.html
Copyright © 2011-2022 走看看