【问题标题】:Building rudimentary data binding with jQuery but variables are not scoping properly使用 jQuery 构建基本数据绑定,但变量范围不正确
【发布时间】:2013-07-19 16:22:53
【问题描述】:

我正在尝试从控制器复制一些带有视图模板的基本数据绑定。我正在使用直接的 JS 和 jQuery 构建它。我的控制器函数中有一个变量,我想在用户输入字段时进行更改。事件正在正确触发,但变量保持不变。确定变量范围的最佳方法是什么,这样才能奏效:

function myController() {
    var password = '1234';

    //handle data binding 
bindTo = function(elem, prop) {

    console.log('original stored prop = ' + prop); //this logs out 1234 
            //BUT only the first time
            //on every subsequent keypress it logs out the value that the user types
            //which has no effect on the var password in the controller                

    var elem = $(elem);
    var value = elem.val();

     // Save current value of element
    elem.data('oldVal', value);

    // Look for changes in the value
    elem.bind("propertychange keyup input paste", function(event){
        console.log('inside bind fn prop = ' + prop)
    var val = elem.val();
    // If value has changed...
    if (elem.data('oldVal') != val) {
        // Updated stored value
        elem.data('oldVal', val);
        prop = val; //where is prop being set?
        console.log(prop); //this logs my value properly
     }
   });

};

//set bindings
bindTo($('input.loginPassword')[0], password);
}

【问题讨论】:

    标签: javascript jquery data-binding scope


    【解决方案1】:

    试试这个

    function myController(elem, prop) {
    var password = '1234';
    
    
    bindTo = function(elem, prop) {
    
    console.log('original stored prop = ' + prop); //this logs out 1234 
            //BUT only the first time
            //on every subsequent keypress it logs out the value that the user types
            //which has no effect on the var password in the controller                
    
    var elem = $(elem);
    var value = elem.val();
    
     // Save current value of element
    elem.data('oldVal', value);
    
    // Look for changes in the value
    elem.bind("propertychange keyup input paste", function(event){
        console.log('inside bind fn prop = ' + prop)
    var val = elem.val();
    // If value has changed...
    if (elem.data('oldVal') != val) {
        // Updated stored value
        elem.data('oldVal', val);
        prop = val; //where is prop being set?
        console.log(prop); //this logs my value properly
     }
     });
    
         }(elem, prop);
    

    【讨论】:

    • 谢谢,但我希望能够将许多变量绑定在一起。看起来最后的 (elem, prop) 让它自动执行?这是范围界定的必要部分吗?我想我的主要问题是关于我传递给 bindTo() 的“prop”参数。我怎样才能让它真正与 myController 的范围相关。在某一时刻它似乎是,然后它不是。也许是因为我无意中在函数的本地范围内创建了一个“prop”var,所以它永远不会回到主 myController 函数中 prop 表示的原始 var。
    • 最后一行中的 (elem,prop) 进行作用域,它也包含在 FrontController 函数中。 @斯科特赖特
    • 感谢范围界定技术。我仍然觉得我还有很长的路要走,然后才能使用这段代码到达我想去的地方。感觉应该有另一种方式。应用程序的结构和我想要使用控制器的方式不允许这种实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2018-12-21
    相关资源
    最近更新 更多