对 Ko 视图模型的函数响应调用
Function response recall to Ko viewmodel
我的移动应用程序在应用程序登录时加载 API 个端点。我可以在 DOM 中看到的 API 端点之一 returns 数据。我需要将此数据加载到另一个 view/view-model 中,而无需再次 API 调用数据。
companyDataService.js -(此 returns 在登录时加载的 api 数据端点需要用于我的视图模型的应用程序上的另一个视图)
function getHelpText (companyName, userName, password) {
return api.helpTextGet(company.name, company.userName, company.password);
}
我希望上面返回的数据用于我的 "help text" 视图模型,以便可以将其传递到关联的视图。这是我在我的视图模型中尝试过的:
var MyText = ko.observable();
var company = shell.authenticatedCompany();
return companyDataService.getHelpText(company.name, company.userName, company.password).then(function (data) {
if (!data) {
MyText(document.getElementById('no-help').innerHTML = '<div class="flex-item"><p>Request help from Support:<br /><a href="mailto:support@company.com" class="low-profile-btn btn btn-lg"><i class="fa fa-info-circle"></i> Contact Support</a></p></div>');
} else {
MyText(data);
}
});
return {
MyText: MyText
};
});
关于如何做到这一点有什么想法吗?要在此视图模型中使用的预加载数据?如果有人可以帮助解决这个问题,我将不胜感激,因为我正在努力寻找承诺,q.defer 等......但是我认为它比这简单得多但无法解决它。
这是我的观点 ko:
<section class="help-text">
<div class="flex-container">
<div id="no-help" class="help-content" data-bind="html: MyText"></div>
</div>
如果我对问题的理解正确,那么您之前在您的页面(或另一个视图模型)上进行了 API 调用,从您的服务器获取了一些数据。现在您需要在另一个视图模型中使用相同的数据,并且不想再次调用 API。
根据发布的代码,我建议将初始 API 调用移出视图模型(以免一遍又一遍地重复),而是传入调用完成后返回的值.
var HelpTextViewModel = function(helpMarkup){
var self = this;
var defaultMarkup = '<div class="flex-item"><p>Request help from Support:<br /><a href="mailto:support@company.com" class="low-profile-btn btn btn-lg"><i class="fa fa-info-circle"></i> Contact Support</a></p></div>';
//Use default text if nothing was passed in
//Side note - when using the knockout html binding, you can simply call myObservable(myHtml), no need to crawl the dom and set inner html.
self.helpText = ko.observable((helpMarkup && helpMarkup !== "") ? helpMarkup : defaultMarkup);
};
$.when(myAPICallPromise).done(function(apiData){
console.log("API data:", apiData);
ko.applyBindings(new HelpTextViewModel(apiData));
//Do something else with my API data if I want to...
});
在这个例子中,我采用了你所拥有的,并添加了一种方法来为我的 observable 传递一个初始值,并定义了一个默认值,如果没有提供,或者它是空白的。我还将 API 调用移出了视图模型,所以现在视图模型 仅 依赖于初始化时传入的内容。
对于 API 调用,我建议再看一下 promises 和 deferred,但您也可以通过成功回调来完成此操作。如果您使用 jQuery 进行 API 通话,jquery.ajax() implements the promise interface by default。在代码片段中,我假设 jQuery promise 用于我的 API 调用,当它完成 (.done) 时,我使用服务器返回给我的任何内容初始化我的视图模型。
无论如何,如果您不想重复您的 API 调用,请将您的 API 调用移出您的视图模型,确保它只调用一次,并将值传递给您的 API 将您分为页面的不同部分。
companyDataService.js -(这个 returns 在登录时加载的 api 数据端点需要我的视图模型在应用程序上的另一个视图)
function getHelpText(companyName, userName, password) {
return api.helpTextGet(company.name, company.userName, company.password).then(function (helpText) {
company.helpText = helpText;
});
}
我的视图模型-
var MyText = ko.observable();
var company = shell.authenticatedCompany();
MyText(company.helpText);
return {
MyText: MyText
};
我的移动应用程序在应用程序登录时加载 API 个端点。我可以在 DOM 中看到的 API 端点之一 returns 数据。我需要将此数据加载到另一个 view/view-model 中,而无需再次 API 调用数据。
companyDataService.js -(此 returns 在登录时加载的 api 数据端点需要用于我的视图模型的应用程序上的另一个视图)
function getHelpText (companyName, userName, password) {
return api.helpTextGet(company.name, company.userName, company.password);
}
我希望上面返回的数据用于我的 "help text" 视图模型,以便可以将其传递到关联的视图。这是我在我的视图模型中尝试过的:
var MyText = ko.observable();
var company = shell.authenticatedCompany();
return companyDataService.getHelpText(company.name, company.userName, company.password).then(function (data) {
if (!data) {
MyText(document.getElementById('no-help').innerHTML = '<div class="flex-item"><p>Request help from Support:<br /><a href="mailto:support@company.com" class="low-profile-btn btn btn-lg"><i class="fa fa-info-circle"></i> Contact Support</a></p></div>');
} else {
MyText(data);
}
});
return {
MyText: MyText
};
});
关于如何做到这一点有什么想法吗?要在此视图模型中使用的预加载数据?如果有人可以帮助解决这个问题,我将不胜感激,因为我正在努力寻找承诺,q.defer 等......但是我认为它比这简单得多但无法解决它。
这是我的观点 ko:
<section class="help-text">
<div class="flex-container">
<div id="no-help" class="help-content" data-bind="html: MyText"></div>
</div>
如果我对问题的理解正确,那么您之前在您的页面(或另一个视图模型)上进行了 API 调用,从您的服务器获取了一些数据。现在您需要在另一个视图模型中使用相同的数据,并且不想再次调用 API。
根据发布的代码,我建议将初始 API 调用移出视图模型(以免一遍又一遍地重复),而是传入调用完成后返回的值.
var HelpTextViewModel = function(helpMarkup){
var self = this;
var defaultMarkup = '<div class="flex-item"><p>Request help from Support:<br /><a href="mailto:support@company.com" class="low-profile-btn btn btn-lg"><i class="fa fa-info-circle"></i> Contact Support</a></p></div>';
//Use default text if nothing was passed in
//Side note - when using the knockout html binding, you can simply call myObservable(myHtml), no need to crawl the dom and set inner html.
self.helpText = ko.observable((helpMarkup && helpMarkup !== "") ? helpMarkup : defaultMarkup);
};
$.when(myAPICallPromise).done(function(apiData){
console.log("API data:", apiData);
ko.applyBindings(new HelpTextViewModel(apiData));
//Do something else with my API data if I want to...
});
在这个例子中,我采用了你所拥有的,并添加了一种方法来为我的 observable 传递一个初始值,并定义了一个默认值,如果没有提供,或者它是空白的。我还将 API 调用移出了视图模型,所以现在视图模型 仅 依赖于初始化时传入的内容。
对于 API 调用,我建议再看一下 promises 和 deferred,但您也可以通过成功回调来完成此操作。如果您使用 jQuery 进行 API 通话,jquery.ajax() implements the promise interface by default。在代码片段中,我假设 jQuery promise 用于我的 API 调用,当它完成 (.done) 时,我使用服务器返回给我的任何内容初始化我的视图模型。
无论如何,如果您不想重复您的 API 调用,请将您的 API 调用移出您的视图模型,确保它只调用一次,并将值传递给您的 API 将您分为页面的不同部分。
companyDataService.js -(这个 returns 在登录时加载的 api 数据端点需要我的视图模型在应用程序上的另一个视图)
function getHelpText(companyName, userName, password) {
return api.helpTextGet(company.name, company.userName, company.password).then(function (helpText) {
company.helpText = helpText;
});
}
我的视图模型-
var MyText = ko.observable();
var company = shell.authenticatedCompany();
MyText(company.helpText);
return {
MyText: MyText
};