2014-03-12 34 views
0

我有一些屬性的變量,並且功能 我正在嘗試去屬性,但是這給了我空虛的變量。 我能做什麼?例如:敲除訪問變量

var exports = { 

    city: ko.observable(), 
    street: ko.observable().extend({ required: true, number:true}), 

    back : function(){ 
     console.log(this.city); 
    }, 

HTML

 <button data-bind="click: back" class="btn btn-default">Back</button> 

我還附上了完整的HTML和JS。對此,我無法得到this.myAcmout()。上回復功能:

HTML

<div class="responses"> 
<div role="form" class="form-horizontal"> 

    <div class="form-group"> 
     <label class="col-sm-1 control-label">{{_t('Responses')}}</label> 

     <div class="col-sm-10"> 

      <div class="form-control-static" data-bind="visible: request.responses().length == 0"> 
       {{_t('No responses.')}} 
      </div> 

      <table class="table table-striped table-hover col-sm-12" 
        data-bind="visible: request.responses().length > 0"> 
       <thead> 
       <tr> 
        <th>{{_t('Created')}}</th> 
        <th>{{_t('Amount')}}</th> 
        <th>{{_t('Rate')}}</th> 
        <th>{{_t('Distance')}}</th> 
        <th></th> 
       </tr> 
       </thead> 
       <tbody data-bind="foreach: request.responses()"> 
       <tr class="clickable"> 
        <td>{{since()}}</td> 
        <td>{{amount}}</td> 
        <td>{{rate}}</td> 
        <td>{{distance}}</td> 
        <td> 
         <a data-bind="click: action">{{_t('Details')}}</a> 
       </tr> 
       </tbody> 
      </table> 

     </div> 
    </div> 


    <!-- ko if: !isRequestor --> 
    <h5>{{_t('Your response')}}</h5> 

    <div class="form-group" data-bind="css: { hideErrors: !hasBeenSubmittedOnce()}"> 

     <label class="col-sm-1 control-label">{{_t('Amount')}}</label> 

     <div class="col-sm-2"> 
     <input type="text" id="myAmountInput" class="form-control" data-bind="'autoNumeric: myAmount'"> 
      </div> 

     <div class="col-sm-1"> 
      <p class="form-control-static">{{ request.requestedCurrency }}</p> 
     </div> 

    </div> 
    <!-- /ko --> 


</div> 


<div class="x-btn-row"> 
    <button class="btn btn-primary" type="button" data-bind="visible: !isRequestor, click: respond"> 
     {{isResponder() ? _t('Update response') : _t('Respond')}} 
    </button> 
    <button data-bind="visible: isRequestor || isResponder(), click: cancel" class="btn btn-danger">{{_t('Cancel') 
     }}</button> 
    <button data-bind="click: back" class="btn btn-default">{{_t('Back')}}</button> 

</div> 

JS

define(['knockout', 'knockout-validation', 'services/changeup', 'moment', 'lodash', 'plugins/router'], function (ko, validation, changeup, moment, _, router) { 

ko.validation.configure({ 
    insertMessages: true, 
    decorateElement: true, 
    errorElementClass: 'error', 
    errorMessageClass: 'help-inline ' 
}); 

function tick(){ 
    var request = exports.request; 
    console.log('tick', request); 
    if(request){ 
     request.endsIn(moment.utc(request.expiresAt).fromNow()); 
     _.each(request.responses(), function(rs){ 
      rs.since(moment.utc(rs.createdAt).fromNow()); 
     }); 
    } 
} 

function belongsToUserInfo(r){ 
    return r && exports.userInfo && r.username === exports.userInfo.username; 
} 

var timerId = setInterval(tick, 1000 * 10); 

var exports = { 

    isRequestor: undefined, 

    myAmount: ko.observable().extend({ required: true, number:true}), 

    isResponder: ko.observable(), 

    request: undefined, 

    userInfo: undefined, 

    hasBeenSubmittedOnce : ko.observable(false), 

    errors : ko.validation.group(this), 

    action : function(){ 

    }, 

    back : function(){ 
    }, 

    cancel : function(){ 
    }, 

    respond: function(scope){ 
     console.log(this.myAmount()); 
     this.hasBeenSubmittedOnce(true); 
     var r=confirm("Are you sure you want to give proposal? your current proposal is: " + exports.request.amount); 
     if (r===true){ 
      if (!this.myAmount.isValid()){ 
       this.errors.showAllMessages(); 
      } else { 
       changeup.respond(exports.request._id, exports.myAmount()).then(function(){ 
        router.navigate('dashboard'); 
       }); 
      } 
     } 
    }, 

    activate: function (activationData) { 
    } 

}; 


return exports; 

});

+0

你想說什麼,請告訴我們結果 –

+0

我剛空 – Bruse

+0

當你明白了嗎? –

回答

0

除了丟失的圓括號(其他指出的)我沒有在這裏看到的一個問題。你能用你的完整代碼發表小提琴嗎?

這一個工作:

<input type="text" data-bind="value: city" /> 
<button data-bind="click: back" class="btn btn-default">Back</button> 


var exports = { 
    city: ko.observable('Los Angeles'), 
    street: ko.observable().extend({ 
     required: true, 
     number: true 
    }), 

    back: function (data) { 
     console.log(data.city());  
     // or 
     console.log(this.city()); 
     console.log(this.city);//incorrect 
    } 
}; 
ko.applyBindings(exports); 

http://jsfiddle.net/barryman9000/cdjbX/1/

+0

我添加了完整的代碼到我的問題。它看起來非常糟糕JSfiddle,打擾所有的字符串... – Bruse

+0

那麼你試圖訪問哪個屬性以及從哪個函數中獲取?你想要做什麼的小提琴版本怎麼樣? –

+1

看起來問題在於你的autoNumeric綁定處理函數。如果用常規值bindingHandler替換它,則響應按鈕將起作用。 –

1

我不確定你在哪裏看到null價值,但我想它可以歸因於this.city。要訪問觀測的價值,你應該在city年底做這樣的事

back : function(){ 
console.log(this.city()); 
}, 

通知()。還有一件事,人們看到不相關的價值的另一個最常見的事情是因爲他們將this定義爲錯誤的範圍。

你應該把這個back功能可按這樣

<button data-bind="click: exports.back()" class="btn btn-default">Back</button>  
+0

我試過使用城市(),它沒有工作。也許porlbem的範圍,但我應該如何得到正確的? – Bruse

+0

根據範圍邏輯更新了答案。適當地適用。 –

+0

我無法在我的導出中定義var self = this,如果我正在寫self:this,所以我自己得到「window」 – Bruse