KnockoutJS-从另一个模型视图可观察到的更新

时间:2018-08-16 19:10:32

标签: knockout.js observable model-view

我有一个现有的'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模型视图?

2 个答案:

答案 0 :(得分:1)

attachmentsComposePopupView instance 上的一个属性。

addDropboxAttachmentComposePopupView原型上的一种方法,必须使用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函数中)。