2012-12-12 93 views
1

我正在嘗試爲我的viewModels創建一個通用容器,因此常見的方法可以應用於各種對象,而不需要特定的知識或視圖模型。容器和包含的對象應該是這樣的:通過原型訪問viewModel函數

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功能接入工作正常,因爲實際的viewmodel被創建並傳遞給容器。使用'new self.refModel()'和'self.rootModel.doSomeThing()'似乎按預期工作。當我嘗試使用'self.viewModel.doSomeThing();'淘汰賽抱怨說這不是一項功能。

是否有可能通過引用viewModel來訪問viewModels函數。

任何幫助,將不勝感激。

+0

我很高興幫助。如果你願意,你可以接受答案。 – Stefan

回答

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

+0

完美.....正是我需要的。非常感謝你。 –

0

我想傳遞給ContainerModel這樣,當您應該創建包含的模型實例:

self.container = new ContainerModel(self, new containedViewModel, 'modelName'); 
+0

傳遞viewModel失敗了Container的目的。我需要將一個構造函數傳遞到容器中,以允許我在容器中創建模型,並在構造容器後創建viewModel數組。如果你在'新'分配中傳遞viewModel,會抱怨沒有構造函數。問題是用傳遞的構造函數構造的對象不能用於訪問viewModel函數。 –

+0

如果我將構造函數和視圖模型都傳遞到容器中,如... containedViewModel(self,containedViewModel,new containedViewModel,'name'),我可以使用構造函數創建新模型,並且可以使用視圖模型訪問函數,讓我感到困惑的是爲什麼我不能使用使用容器中的構造函數創建的模型來訪問函數。 –