我有一个现有的'Header of 'Run OB' Module
Sub OrganizeBenchmarks(bidNum As String, name As String, _
state As String, year As String, category As String)
模型视图,其中包含可观察的
Private Sub CommandButton1_Click()
'...'
End Sub
和下面的方法
ComposePopupView()
然后我创建了另一个名为this.attachments = ko.observableArray([]);
的模型视图,在其中我以上述方式访问
ComposePopupView.prototype.addDropboxAttachment = function (oDropboxFile)
{
var
oAttachment = null,
iAttachmentSizeLimit = Utils.pInt(Settings.settingsGet('AttachmentLimit')),
mSize = oDropboxFile['bytes']
;
oAttachment = new ComposeAttachmentModel(
oDropboxFile['link'], oDropboxFile['name'], mSize
);
oAttachment.fromMessage = false;
oAttachment.cancel = this.cancelAttachmentHelper(oDropboxFile['link']);
oAttachment.waiting(false).uploading(true).complete(false);
this.attachments.push(oAttachment);
this.attachmentsPlace(true);
if (0 < mSize && 0 < iAttachmentSizeLimit && iAttachmentSizeLimit < mSize)
{
oAttachment.uploading(false).complete(true);
oAttachment.error(Translator.i18n('UPLOAD/ERROR_FILE_IS_TOO_BIG'));
return false;
}
Remote.composeUploadExternals(function (sResult, oData) {
var bResult = false;
oAttachment.uploading(false).complete(true);
if (Enums.StorageResultType.Success === sResult && oData && oData.Result)
{
if (oData.Result[oAttachment.id])
{
bResult = true;
oAttachment.tempName(oData.Result[oAttachment.id]);
}
}
if (!bResult)
{
oAttachment.error(Translator.getUploadErrorDescByCode(Enums.UploadErrorCode.FileNoUploaded));
}
}, [oDropboxFile['link']]);
return true;
};
但是会引发错误
无法读取未定义的属性“附件”
然后我决定添加可观察的
UsersDocumentsPopupView()
到我的模型视图,然后又累了
DropBox = __webpack_require__(/*! View/Popup/Compose */ 31)
....
DropBox.prototype.addDropboxAttachment(aFiles[0]);
其中this.attachments = ko.observableArray([]);
是从this.attachment.push(oAttachment);
数组中获取的对象,但仍然出现相同的错误。
我的问题是,如何甚至可以从执行另一个模型视图的一个模型视图更新可观察的oAttachment
?
PS。
当我在aFiles
中执行以下代码时,效果很好
attachments
那么在这种情况下,如何将数据ComposePopupView()
从var aFiles = [JSON.parse('{"isDir": false, "name": "koala.jpg", "bytes": 780831,"link": "http://localhost/data/koala.jpg","id": "id:UxmT1S5QcFAAAAAAAAAACw"}')];
if (aFiles && aFiles[0] && aFiles[0]['link'])
{
console.log("Test");
self.addDropboxAttachment(aFiles[0]);
}
传递到aFiles
模型视图?
答案 0 :(得分:1)
attachments
是ComposePopupView
的 instance 上的一个属性。
addDropboxAttachment
是ComposePopupView
原型上的一种方法,必须使用this
上下文引用instance
的{{1}}来调用该方法,以便工作。
有几种方法可以解决此问题。例如:
最有可能:您尚未创建实例:
ComposePopupView
很可能:您已经创建了一个实例,但无法访问它:在构造函数中传递对您要引用的实例的引用。
您是否只会创建DropBox = __webpack_require__(/*! View/Popup/Compose */ 31);
const dropBox = new DropBox();
dropBox.addDropboxAttachment(aFiles[0]);
的一个实例?看看“ Singleton”模式。例如:
ComposePopupView
计划创建共享// "Private" to the module
const MySingletonClass = function() { /* ... */ }
MySingletonClass.prototype.someMethod = function () { };
let singletonInstance = null;
// Only expose a way to get the instance:
export const getSingletonInstance = function() {
if (!singletonInstance) singletonInstance = new MySingletonClass();
return singletonInstance;
}
// In another module:
import { getSingletonInstance } from "./MySingletonClass";
const dropBox = getSingletonInstance();
dropBox.someMethod(aFiles[0]);
数据的几个实例?将其设为静态值。
答案 1 :(得分:0)
我最终使用了Knockout的发布/订阅功能。
下面的基本示例:
node
第一个视图模型订阅一个特定的主题,第二个视图模型通过该主题的邮箱进行通知。彼此之间没有直接的依赖关系。
某些情况下,邮箱不一定是全局的,可以传递到视图模型构造函数中,也可以仅在自执行函数中创建。
示例:http://jsfiddle.net/xpvt214o/708647/
此外,邮箱可能只是var postbox = ko.observable();
function MyModalViewA()
{
var _self = this;
var test = new Array();
_self.rows = ko.observableArray([]);
postbox.subscribe(function(newValue) {
_self.rows.push(newValue);
//test = test.concat(newValue);
console.log("Rows " + JSON.stringify(test));
}, null, "NewRowAvailable"
);
};
function MyModalViewB()
{
var _self = this;
_self.search = function() {
var newRow = JSON.parse('{ "label" : "abc" }');
postbox.notifySubscribers(newRow, "NewRowAvailable");
};
};
var vma = new MyModalViewA();
ko.applyBindings(vma, $("#vma").get(0));
var vmb = new MyModalViewB();
ko.applyBindings(vmb, $("#vmb").get(0));
(包含在ko.observable函数中)。