2011-09-07 49 views
1

我想在jQuery插件中使用jQuery的.data()工具,但我得到了一些奇怪的结果。 这里是我的插件的削减版本,相关代码:jQuery .data()和插件

(function($){ 

    var methods = { 
     init : function(options) { 

      // Do some stuff 
      this.data('name', 'New Component'); 
      return this; 
     }, 
     getStateData : function() { 
      // Function returns all data for save 
      var state = new Object; 

      state.name = this.data('name'); 

      // snip ... Add some other bits to state 
      // ... 

      return state;    
     }, 
     setStateData: function (args) { 
      var key  = args[0]; 
      var value = args[1]; 

      // snip 
      this.data(key, value); 
     } 
    }; 

    $.fn.component7Segment = function(method) { 
     if (methods[method]) { 
      return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } else if (typeof method === 'object' || ! method) { 
      return methods.init.apply(this, arguments); 
     } else { 
      $.error('Method ' + method + ' does not exist on jQuery.designComponent'); 
     }  
    }; 
})(jQuery); 

如果我打电话$(instance-of-plugin).component7Segment('getStateData');插件返回正确的“姓名”但如果我叫setStateData更改名称它并没有改变“名字'的价值,当我下一个电话getStateData

在每个功能做console.log(this);看起来略有不同,所以我开始尝试:

$.data($('#object-id'), 'name', value); 

这仍然没有收到预期的效果。

任何人都可以看到我失踪?

回答

2

假设你打电话setStateData这样的:

$(instance).component7Segment("setStateData", "name", "Foo"); 

setStateData功能应该改成这个样子:

setStateData: function() { 
    var key  = arguments[0]; 
    var value = arguments[1]; 

    // snip 
    this.data(key, value); 
} 

注意去除args参数和使用的取而代之的是特殊的arguments array-like object

例子:http://jsfiddle.net/andrewwhitaker/ShFHC/

你原来的问题是最有可能的,你是叫setStateData与参数name"foo"args[0]args[1]实际上是在该位置访问name中的字符,而不是传递给函数的参数。

+0

谢谢,我通过调用它(“setStateData”,[“name”,“Foo”])和console.log(key +''+ value)显示正确的结果。我换了你的方法,但似乎没有什么区别。 – JimBlizz

+0

仅供参考您的示例在JSFiddle中工作,但不在我的应用程序中......非常奇怪...... – JimBlizz

+0

@JimBlizz:这很奇怪。你最初的方式应该是... –