Knockout应用开发指南之创建自定义绑定

创建自定义绑定

创新互联公司专注于企业成都营销网站建设、网站重做改版、榕城网站定制设计、自适应品牌网站建设、HTML5商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为榕城等各大城市提供网站开发制作服务。

你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等)。你可以你封装复杂的逻辑或行为,自定义很容易使用和重用的绑定。例如,你可以在form表单里自定义像grid,tabset等这样的绑定。

重要:以下文档只应用在Knockout 1.1.1和更高版本,Knockout 1.1.0和以前的版本在注册API上是不同的。

注册你的绑定

添加子属性到ko.bindingHandlers来注册你的绑定:

 
 
 
  1. ko.bindingHandlers.yourBindingName = {
  2.     init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
  3.         // This will be called when the binding is first applied to an element
  4.         // Set up any initial state, event handlers, etc. here
  5.     },
  6.     update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
  7.         // This will be called once when the binding is first applied to an element,
  8.         // and again whenever the associated observable changes value.
  9.         // Update the DOM element based on the supplied values here.
  10.     }
  11. };

… 然后就可以在任何DOM元素上使用了:

 
 
 
  1.  

注:你实际上没必要把init和update这两个callbacks都定义,你可以只定义其中的任意一个。

update 回调

当管理的observable改变的时候,KO会调用你的update callback函数,然后传递以下参数:

◆ element — 使用这个绑定的DOM元素

◆ valueAccessor —JavaScript函数,通过valueAccessor()可以得到应用到这个绑定的model上的当前属性值。

◆ allBindingsAccessor —JavaScript函数,通过allBindingsAccessor ()得到这个元素上所有model的属性值。

◆ viewModel — 传递给ko.applyBindings使用的 view model参数,如果是模板内部的话,那这个参数就是传递给该模板的数据。

例如,你可能想通过 visible绑定来控制一个元素的可见性,但是你想让该元素在隐藏或者显示的时候加入动画效果。那你可以自定义自己的绑定来调用jQuery的slideUp/slideDown 函数:

 
 
 
  1. ko.bindingHandlers.slideVisible = {
  2.     update: function(element, valueAccessor, allBindingsAccessor) {
  3.         // First get the latest data that we're bound to
  4.         var value = valueAccessor(), allBindings = allBindingsAccessor();        
  5.         // Next, whether or not the supplied model property is observable, get its current value
  6.         var valueUnwrapped = ko.utils.unwrapObservable(value);
  7.         // Grab some more data from another binding property
  8.         var duration = allBindings.slideDuration || 400;
  9.         // 400ms is default duration unless otherwise specified
  10.      
  11.         // Now manipulate the DOM element
  12.         if (valueUnwrapped == true)
  13.             $(element).slideDown(duration); // Make the element visible
  14.         else
  15.             $(element).slideUp(duration);   // Make the element invisible
  16.     }
  17. };

然后你可以像这样使用你的绑定:

 
 
 
  1. You have selected the option
  •  
  •     var viewModel = {
  •         giftWrap: ko.observable(true)
  •     };
  •     ko.applyBindings(viewModel);
  • 当然,看来可能代码很多,但是一旦你创建了自定义绑定,你就可以在很多地方重用它。

    init 回调

    Knockout在DOM元素使用自定义绑定的时候会调用你的init函数。init有两个重要的用途:

    ◆ 为DOM元素设置初始值

    ◆ 注册事件句柄,例如当用户点击或者编辑DOM元素的时候,你可以改变相关的observable值的状态。

    KO会传递和update回调函数一样的参数。

    继续上面的例子,你可以像让slideVisible在页面***次显示的时候设置该元素的状态(但是不使用任何动画效果),而只是让动画在以后改变的时候再执行。你可以这样来做:

     
     
     
    1. ko.bindingHandlers.slideVisible = {
    2.     init: function(element, valueAccessor) {
    3.         var value = ko.utils.unwrapObservable(valueAccessor());
    4.         // Get the current value of the current property we're bound to
    5.         $(element).toggle(value);
    6.         // jQuery will hide/show the element depending on whether "value" or true or false
    7.     },
    8.     update: function(element, valueAccessor, allBindingsAccessor) {
    9.         // Leave as before
    10.     }
    11. };

    这就是说giftWrap的初始值声明的是false(例如giftWrap: ko.observable(false)),然后让初始值会让关联的DIV隐藏,之后用户点击checkbox的时候会让元素显示出来。

    DOM事件之后更新observable值

    你已经值得了如何使用update回调,当observable值改变的时候,你可以更新相关的DOM元素。但是其它形式的事件怎么做呢?比如当用户对某个DOM元素有某些action操作的时候,你想更新相关的observable值。

    你可以使用init回调来注册一个事件句柄,这样可以改变相关的observable值,例如,

     
     
     
    1. ko.bindingHandlers.hasFocus = {
    2.     init: function (element, valueAccessor) {
    3.         $(element).focus(function () {
    4.             var value = valueAccessor();
    5.             value(true);
    6.         });
    7.         $(element).blur(function () {
    8.             var value = valueAccessor();
    9.             value(false);
    10.         });
    11.     },
    12.     update: function (element, valueAccessor) {
    13.         var value = valueAccessor();
    14.         if (ko.utils.unwrapObservable(value))
    15.             element.focus();
    16.         else
    17.             element.blur();
    18.     }
    19. };

    现在你可以通过hasFocus绑定来读取或者写入这个observable值了:

     
     
     
    1. Name: 

    2. You're editing the name
  • Edit name
  •     var viewModel = {
  •         editingName: ko.observable()
  •     };
  •     ko.applyBindings(viewModel);
  • 原文:http://www.cnblogs.com/TomXu/archive/2011/11/26/2256949.html

    【系列文章】

    1. Knockout应用开发指南之入门介绍
    2. Knockout应用开发指南之绑定语法
    3. Knockout应用开发指南之监控属性(Observables)
    4. Knockout应用开发指南之模板绑定

    名称栏目:Knockout应用开发指南之创建自定义绑定
    浏览路径:http://www.csdahua.cn/qtweb/news26/268626.html

    网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网

    成都快上网为您推荐相关内容

    网站策划知识

    分类信息网