如何在App Maker数据源中设置当前项?

时间:2018-04-30 16:53:33

标签: google-app-maker

这看起来很基本,但我似乎无法弄清楚如何从数据源手动设置当前项目?

为了说明:我有一个表,我注意到当我选择一行来编辑一个字段时,该行的项目将成为当前项目,因此如果我在该行上有一个链接以导航到一个页面,所选项目的行将是导航页面的datasource.item。

但是,我还注意到,如果我只是将鼠标悬停在一行上而不选择编辑字段,那么如果我单击导航到页面的链接,它将加载先前选择/编辑的任何行的数据。因此,我想知道如何使它只在鼠标上:结束(或点击快捷键而不事先点击行中的另一个字段)datasource.item将更新到鼠标已经消失的行而不是要求首先编辑行上的字段。我希望这是有道理的。

非常感谢协助。谢谢!

2 个答案:

答案 0 :(得分:4)

为什么会这样:

AM code: generate button click event
User code: handle button's click event
User code: navigate user to different page
AM code: destroy DOM of current page
AM code: build DOM for new page
-- dead code after this line
AM code: row click event handler
AM code: change datasource's current item

Row的click事件处理程序永远不会获得控制权,因为行被用户代码破坏。

Morfinismo解决方案的作用是什么?

AM code: generate button click event
User code: handle button's click event
AM code: row click event handler
AM code: change datasource's current item
-- moved lines
User code: navigate user to different page
AM code: destroy DOM of current page
AM code: build DOM for new page

以下是更多技术细节:Event Loop

在App Maker中,可以使用

解决此问题
  1. setTimeout
  2. 强制用户代码中的当前项目更新
  3. // button's onClick event handler
    app.datasource.ListDatasource.selectKey(widget.datasource.item._key);
    
    1. CustomProperties
    2. // button's onClick event handler
      app.pages.ShowMeNext.properties.Key = widget.datasource.item._key;
      app.showPage(app.pages.ShowMeNext);
      
      // next page's onAttach event handler
      app.datasources.RecordDatasource.filters._key._equals = app.currentPage.properties.Key;
      app.datasources.RecordDatasource.load();
      
      1. URL parametershistory - 此方法在大多数template apps中使用,因为它还在某种程度上实现了深层链接。
      2. // button's onClick event handler
        var params = {
                       key: widget.datasource.item._key
                     };
        var page = app.pages.ShowMeNext;
        app.showPage(page);
        google.script.history.replace(null, params, page.name);
        
        // next page's onAttach event handler
        google.script.url.getLocation(function(location) {
          app.datasources.RecordDatasource.filters._key._equals = location.parameters.key;
        });
        
        1. 使用全局范围在页面之间传递值
        2. // button's onClick event handler
          window.key = widget.datasource.item._key;
          
          // next page's onAttach event handler
          app.datasources.RecordDatasource.filters._key._equals = window.key;
          

          ListDatasource - list / grid / table datasource

          RecordDatasource - 专用于特定记录的数据源(单记录数据源)

答案 1 :(得分:3)

使用超时功能。发生这种情况是因为appmaker需要一些时间来更改数据源中的项目。你可以在按钮或链接的 onClick 事件处理程序中使用这样的东西,它将带你到另一页:

setTimeout(function(){
  app.showPage(app.pages.pageToNavigate);
},200);

那应该解决这个问题。我希望这有帮助!