1

ビューモデルの一般的なコンテナを作成しようとしているので、ビューモデルに関する特定の知識がなくても、さまざまなオブジェクトに共通のメソッドを適用できます。コンテナーと含まれるオブジェクトは次のようになります。

var containedViewModel = function() {
  var self = this;
  self.id = ko.observable();
    ...
  self.doSomething = function() {
  alert('here');
  };

}

var ContainerModel = function(cRoot, cModel, cName) {
  var self = this;

  self.rootModel  = cRoot;                       // Root view model
  self.viewName   = cName;                       // viewModel container name
  self.refModel   = cModel;                      // viewModel reference
  self.viewModel  = ko.observable();             // Single view model
  self.viewModels = ko.observableArray();        // Array of view models

  self.init = function(rootModel) {
    self.viewModel = new self.refModel();
  } 
  self.doSomething = function() {
    self.rootModel.doSomeThing();    // This works
    self.refModel.doSomeThing();     // This does not work
    self.viewModel.doSomeThing();    // This does not work as well
  } 

}

そして、コンテナは次のような呼び出しで作成されます:

var ParnentModel = function() {
  var self = this;
  self.id = ko.observable();
    ...
  self.container = new ContainerModel(self, containedViewModel, 'modelName');
    ...
  self.doSomething = function() {
  alert('here');
  };
};

この例では、実際のビューモデルが作成されてコンテナーに渡されるため、rootModel 関数へのアクセスは正常に機能します。「new self.refModel()」と「self.rootModel.doSomeThing()」を使用すると、期待どおりに動作するようです。「self.viewModel.doSomeThing();」を使おうとすると ノックアウトは、それが関数ではないことを訴えます。

viewModel への参照によって viewModels 関数にアクセスすることは可能ですか。

どんな助けでも大歓迎です。

4

2 に答える 2

1

あなたはほとんどそこにいます。コード内の私のコメントを参照してください。

var containedViewModel = function() {
  var self = this;
  self.id = ko.observable();
  self.doSomething = function() {
    alert('contained');
  };
  // I would prefer to have return self here
};

var ContainerModel = function(cRoot, cModel, cName) {
  var self = this;

  self.rootModel  = cRoot;                       // Root view model
  self.viewName   = cName;                       // viewModel container name
  self.refModel   = cModel;                      // viewModel reference
  self.viewModel  = ko.observable();             // Single view model
  self.viewModels = ko.observableArray();        // Array of view models

  self.init = function(rootModel) {
    // you meant this, right?
    self.viewModel(new self.refModel());
  }; 
  self.doSomething = function() {
    self.rootModel.doSomething();    // This works
    //self.refModel.doSomeThing();     // This does not work
    // need to unwrap the value, fixed typo
    self.viewModel().doSomething();    // This does not work as well
  };
};

var ParnentModel = function() {
  var self = this;
  self.id = ko.observable();
  self.container = new ContainerModel(self, containedViewModel, 'modelName');
  // missing call to init
  self.container.init();
  self.doSomething = function() {
      alert('parent');
  };
};

// execution
var p = new ParnentModel();
p.container.doSomething();

http://jsbin.com/arezew/1/edit

于 2012-12-12T07:53:20.393 に答える
0

次のように ContainerModel に渡すときに、含まれているモデルのインスタンスを作成する必要があると思います。

self.container = new ContainerModel(self, new containedViewModel, 'modelName');
于 2012-12-12T07:41:10.367 に答える