KnockoutJS可观察到的对另一种方法的引用

时间:2018-11-01 13:42:39

标签: javascript knockout.js

我有三个文件。在第一个文件中,定义了数据结构或对象,我想在其中保留一些值。

1.File

    ....
    function DataTO(){
        ...
        this.object = ko.observable();
        ...
    }

然后我有第二个文件,在其中创建了DataTO实例,并将该实例发送到第三个文件。

2.File

    //here is created the object of DataTO instance.
    sendToThirdFile(dataTO().object);

在最后一个文件中,我接收到对象参数,该参数是DataTO对象中称为对象的属性。

3.File

   function(object){
     this.computedValue = ko.observable(value);

     //here I need to set computedValue to object.

     this.object = object;
   }

问题是,它不起作用。有什么方法可以始终随着calculatedValue的更改来更改对象的值吗?那么更改将出现在第二个文件中吗?

1 个答案:

答案 0 :(得分:0)

这可能是您问题的相当间接的答案。但是我不得不整理几次以分解出一个大型的淘汰表视图模型。这是到目前为止我提出的最好的解决方案。

免责声明:对不起,语法有点混乱,如今许多淘汰赛项目可能有点遗留,我使用es6和较旧代码的混搭来使本文花费的时间不会太长。

viewModelLoader.js-加载所有依赖项,创建一个可传递给每个文件的全局可预订项,在加载所有依赖项后,它将所有代码捆绑到主viewmodel中。

viewmodelController.js-初始化您要准备放入ViewModel的代码,就像创建该层一样,这样我就可以轻松地处理加载顺序。

fileA,fileB-将代码放入其中的文件。

/* 
	viewModelLoader.js  (index.js)
*/

import VMC from './viewmodelController';
import fileA from './fileA';
import fileB from './fileB’;

var viewModelLoader = {
    	init: function() {
		    var shouter = new ko.subscribable();
      	
        VMC.viewmodelController(fileA, fileB);
        ko.applyBindings({
          MyViewModel : new viewmodelController.MyViewModel()
        });
	}
);

viewModelLoader.init();

/* 
	viewmodelController.js
*/
export default {
	viewmodelController: function(fileA, fileB) {
      		this.MyViewModel = function() {
        			var self = this;

			// do stuff

        			fileA.init(self);
        			fileB.init(self);

			// do stuff
		}
	}
}

/* 
 fileA.js
*/
export default {
    	init: function(self) {
		/* 
			knockout stuff, define some variables / observables
		*/
	}
}

/* 
 fileB.js
*/
export default {
    	init: function(self) {
		/* 
			knockout stuff, do some stuff the variables 
		*/
		
	}
}

以下是使用requirejs的该想法的较旧版本,您可以查看以查看有效的示例https://github.com/digital-pollution/ko-demo