跨同一组件的实例共享可观察对象
Sharing observable across instances of the same component
我有一个下拉菜单组件(实际上是一个 bootstrap 按钮菜单)。 'dropdown' 通过对服务器执行 AJAX 调用并解析 JSON 字符串来获取它的值。
我在页面的多个位置都需要这个按钮,但是我每次都需要组件的新实例,因为我必须传入调用视图模型以向其添加一些数据。
显然,每次我包含此按钮时,组件都会执行 ajax 调用以获取其值,这意味着对服务器有 n 次 AJAX 调用。无论如何我可以只做一个 Ajax 调用并将它传播到组件的每个实例吗?
按钮组件
function AddElement(params) {
this.options = ko.observableArray();
var self = this;
var section = params.section;
$.getJSON("http://localhost:8080/test", function (data) {
elementOptions = data;
self.options(data);
});
this.addElement = function (data) {
section.formElements.push(data);
};
}
所以问题是我怎样才能实现这个或者有没有更好的方法在 KO 中实现这种功能(即不是组件)
谢谢
大卫
选项 1:在组件的某个公共父级中加载并传入可观察数组。
function AddElement(params) {
var self = this,
section = params.section,
options = params.options;
}
选项 2:将加载程序对象传递给您的组件。
function AddElement(params) {
var self = this,
section = params.section,
loader = params.loader; //All 'AddElement' components get passed the same instance of the loader
this.options = ko.observableArray();
loader.load(function (data) { //The loader is responsible for doing the AJAX once and only once.
elementOptions = data;
self.options(data);
});
}
我有一个下拉菜单组件(实际上是一个 bootstrap 按钮菜单)。 'dropdown' 通过对服务器执行 AJAX 调用并解析 JSON 字符串来获取它的值。
我在页面的多个位置都需要这个按钮,但是我每次都需要组件的新实例,因为我必须传入调用视图模型以向其添加一些数据。
显然,每次我包含此按钮时,组件都会执行 ajax 调用以获取其值,这意味着对服务器有 n 次 AJAX 调用。无论如何我可以只做一个 Ajax 调用并将它传播到组件的每个实例吗?
按钮组件
function AddElement(params) {
this.options = ko.observableArray();
var self = this;
var section = params.section;
$.getJSON("http://localhost:8080/test", function (data) {
elementOptions = data;
self.options(data);
});
this.addElement = function (data) {
section.formElements.push(data);
};
}
所以问题是我怎样才能实现这个或者有没有更好的方法在 KO 中实现这种功能(即不是组件)
谢谢
大卫
选项 1:在组件的某个公共父级中加载并传入可观察数组。
function AddElement(params) {
var self = this,
section = params.section,
options = params.options;
}
选项 2:将加载程序对象传递给您的组件。
function AddElement(params) {
var self = this,
section = params.section,
loader = params.loader; //All 'AddElement' components get passed the same instance of the loader
this.options = ko.observableArray();
loader.load(function (data) { //The loader is responsible for doing the AJAX once and only once.
elementOptions = data;
self.options(data);
});
}