代码之家  ›  专栏  ›  技术社区  ›  JackTheKnife

KnockoutJS-从另一个modelview更新observate

  •  0
  • JackTheKnife  · 技术社区  · 6 年前

    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]);
    

    但它会抛出一个错误

    无法读取未定义的属性“attachments”

    this.attachments=ko.observatearray([]);
    

    到我的modelview然后厌倦了

    this.attachment.push(oAttachment);
    

    哪里 oAttachment aFiles 但我还是有同样的错误。

    我的问题是如何或者甚至是否我可以更新可观测的 attachments

    附言。 当我在下面的代码中 组合操作视图() 它工作得很好

    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]);
    }
    

    阿飞 用户文档PopupView() 组合操作视图() 模型视图?

    2 回复  |  直到 6 年前
        1
  •  1
  •   user3297291    6 年前

    attachments 实例 属于 ComposePopupView .

    addDropboxAttachment 是一种基于 必须用 this 上下文指的是 instance 属于

    有几种方法可以解决这个问题。例如:

    • 最有可能的情况是:您尚未创建实例:

      DropBox = __webpack_require__(/*! View/Popup/Compose */ 31);
      const dropBox = new DropBox();
      dropBox.addDropboxAttachment(aFiles[0]);
      
    • 实例

      // "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]);
      
    • 创作策划 附件 数据?使其成为静态值。

        2
  •  0
  •   JackTheKnife    6 年前

    我最终使用了Knockout的pub/sub功能。

    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));
    

    第一个视图模型订阅特定主题,第二个视图模型通过该主题的邮箱通知。彼此之间没有直接的依赖关系。

    当然,postbox不需要是全局的,可以传递到视图模型构造函数中,或者只是在一个自动执行的函数中创建。

    样品: http://jsfiddle.net/xpvt214o/708647/

    ko.subscribable() (包含在ko.可观测函数中)。

    推荐文章