首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SPFX命令集中使用SP.Modal对话框

在SPFX命令集中使用SP.Modal对话框
EN

Stack Overflow用户
提问于 2018-06-21 09:16:19
回答 1查看 3.7K关注 0票数 0

我的要求是使用列表中的命令集在模态对话中打开SharePoint页面。我注意到了这一点:MSDN教程创建命令集

这个问题是:如何参考sp.js

这是我的.ts文件代码

代码语言:javascript
复制
            import { override } from '@microsoft/decorators';
            import { Log } from '@microsoft/sp-core-library';
            import {
              BaseListViewCommandSet,
              Command,
              IListViewCommandSetListViewUpdatedParameters,
              IListViewCommandSetExecuteEventParameters
            } from '@microsoft/sp-listview-extensibility';
            import { Dialog } from '@microsoft/sp-dialog';
            import { SPComponentLoader } from '@microsoft/sp-loader';
            import * as strings from 'DocManagerCommandSetStrings';
            require('sp-init');
              require('microsoft-ajax');
              require('sp-runtime');
              require('sharepoint');
            /**
             * If your command set uses the ClientSideComponentProperties JSON input,
             * it will be deserialized into the BaseExtension.properties object.
             * You can define an interface to describe it.
             */
            export interface IDocManagerCommandSetProperties {
              // This is an example; replace with your own properties
              sampleTextOne: string;
              sampleTextTwo: string;
            }

            const LOG_SOURCE: string = 'DocManagerCommandSet';

            export default class DocManagerCommandSet extends BaseListViewCommandSet<IDocManagerCommandSetProperties> {

              @override
              public onInit(): Promise<void> {
                Log.info(LOG_SOURCE, 'Initialized DocManagerCommandSet');
                return Promise.resolve();

              }

              @override
              public onListViewUpdated(event: IListViewCommandSetListViewUpdatedParameters): void {
                const compareOneCommand: Command = this.tryGetCommand('COMMAND_1');
                if (compareOneCommand) {
                  // This command should be hidden unless exactly one row is selected.
                  compareOneCommand.visible = event.selectedRows.length === 1;
                }
              }

              @override
              public onExecute(event: IListViewCommandSetExecuteEventParameters): void {

                switch (event.itemId) {
                  case 'COMMAND_1':
                    Dialog.alert(`${this.properties.sampleTextOne}`);
                    break;
                  case 'COMMAND_2':
            //DocManagerCommandSet._loadSPJSOMScripts();

                  var options = {
                title: "My Dialog Title",
                width: 400,
                height: 600,
                url: "/_layouts/DialogPage.aspx" };
                var value = SP.UI.ModalDialog.showModalDialog(options);
                  //  Dialog.alert(`${this.properties.sampleTextTwo}`);
                    break;
                  default:
                    throw new Error('Unknown command');
                }
              }
             private static getSiteCollectionUrl(): string { 
                 let baseUrl = window.location.protocol + "//" + window.location.host; 
               const pathname = window.location.pathname; 
                 const siteCollectionDetector = "/sites/"; 
                 if (pathname.indexOf(siteCollectionDetector) >= 0) { 
                   baseUrl += pathname.substring(0, pathname.indexOf("/", siteCollectionDetector.length)); 
                 } 
                 return baseUrl; 
               } 

               private static _loadSPJSOMScripts() {
                 const siteColUrl = "https://shelldevelopment.sharepoint.com/sites/SPODA0332/";
                 SPComponentLoader.loadScript(siteColUrl + '/_layouts/15/init.js', { 
                    globalExportsName: '$_global_init' 
                  }) 
                     .then((): Promise<{}> => { 
                       return SPComponentLoader.loadScript(siteColUrl + '/_layouts/15/MicrosoftAjax.js', { 
                         globalExportsName: 'Sys' 
                       }); 
                     }) 
                     .then((): Promise<{}> => { 
                       return SPComponentLoader.loadScript(siteColUrl + '/_layouts/15/SP.Runtime.js', { 
                         globalExportsName: 'SP' 
                       }); 
                     }) 
                     .then((): Promise<{}> => { 
                       return SPComponentLoader.loadScript(siteColUrl + '/_layouts/15/SP.js', { 
                        globalExportsName: 'SP' 
                       }); 

                     }) .then((): Promise<{}> => {
                  return SPComponentLoader.loadScript('/_layouts/15/sp.init.js', {
                    globalExportsName: 'SP'
                  });
                }).then((): Promise<{}> => {
                  return SPComponentLoader.loadScript('/_layouts/15/sp.ui.dialog.js', {
                    globalExportsName: 'SP'
                  });
                });

               }
            }

我得到了以下错误:

在行SP.UI.ModalDialog.showModalDialog(options)中找不到名称‘SP’。

请提供一些见解,因为我是SPFX的初学者。

EN

回答 1

Stack Overflow用户

发布于 2019-08-22 14:35:52

理论上,您需要取消对//DocManagerCommandSet._loadSPJSOMScripts();的评论,并等待承诺返回。

将loadSPJSOMScripts消息更新为返回承诺:

代码语言:javascript
复制
private static _loadSPJSOMScripts(): Promise<void> {
    const siteColUrl = "https://shelldevelopment.sharepoint.com/sites/SPODA0332/";
    return SPComponentLoader.loadScript(siteColUrl + '/_layouts/15/init.js', { 
        globalExportsName: '$_global_init' 
    }) 
    // [the rest of the calls... ] 
    .then(_ => {});
}

若要加载onInit(),请执行以下操作:

代码语言:javascript
复制
public onInit(): Promise<void> {
    return Promise.resolve()
      .then(_ => {
          return DocManagerCommandSet._loadSPJSOMScripts();
      });
}

或者在你的onExecute中:

代码语言:javascript
复制
@override
public onExecute(event: IListViewCommandSetExecuteEventParameters): void {
    let launchModal = false;
    switch (event.itemId) {
        case 'COMMAND_1':
            Dialog.alert(`${this.properties.sampleTextOne}`);
            break;
        case 'COMMAND_2':
            launchModal = true;
            break;
        // ...
    }
    if (launchModal) {
        DocManagerCommandSet._loadSPJSOMScripts()
            .then(_ => {
                var options = {
                    title: "My Dialog Title",
                    width: 400,
                    height: 600,
                    url: "/_layouts/DialogPage.aspx" 
                };
                var value = SP.UI.ModalDialog.showModalDialog(options);
            });
    }
}

尽管如此,也许有更好的方法来在SPFX中与JSOM合作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50964807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档