1

私は knockoutjs を使用しています。ここに簡略化されたビューモデルがあります:

  var app = function(){
     var self = this;
     this.index = 0;
     myfunction = function(){
         //how can i modify index here      
         self.index = 1;
     };
     console.log(self.index);  // i want to output 1 here , rather than 0
}; 

new app();​

ありがとう !

4

2 に答える 2

2

これは特にknockout.jsに関連していますか、それとも単純なECMAScriptの問題を並べ替えようとしているだけですか?どれでも...

通常、宣言が行われる場所では関数式を使用しないのが最善です。コンストラクターは、コンストラクターであることを他の人に知らせるために大文字で始める必要があります。

function App() {
    var self = this;

なぜそうしたいのかは不明です。これへの参照を保持することは、コンストラクターでは一般的ではありません。

    this.index = 0;
    myfunction = function(){

ここで問題が発生します。consructorが初めて呼び出されると、上記はmyfunctionという名前のグローバル変数を作成します。そのprobabyはあなたがやりたいことではありません。関数宣言は、明確にローカルに留まります。ただし、関数はとにかくApp.prototypeにあるはずです。

  function myFunction() {

      //how can i modify index here
      self.index = 1;
  };

その関数はインデックスプロパティを変更しますが、それが呼び出された場合に限ります。だからあなたがするかもしれないことは:

function App(){
    this.index = 0;  // Each instance will have an index property
}

// All instances will share a myfunction method
App.prototype.myfunction = function() {
    this.index = 1;
    console.log(this.index);
}

var app = new App();
app.myfunction();  // 1
于 2012-06-21T06:03:50.053 に答える
1

次のように関数を初期化します。

this.myfunction = function(){ 
  self.index = 1;
};

そして、それを呼び出すだけです:

var test = new app();​

test.myfunction();
console.log(test.index);

関数を初期化するときに関数が呼び出されていないため、内部のコードは実行されていません。

ただし、あなたの場合、これで十分なはずです(コードを次のように変更してください):

myfunction();
console.log(self.index);  // i want to output 1 here , rather than 0
于 2012-06-21T05:46:09.393 に答える