如何在 Bixby 的动作输出中使用条件语句

How to conditional statements in action output in Bixby

您好,我想通过在操作输出中放置条件语句来转到另一个操作。 我该怎么办?

例如

action (~~) {
  description (Validate items passed from javascript)
  collect {
    input (~~) {
      type (~~)
      min (~~) max (~~)
    }
  }

  type(~~~)

  output (items){
    on-empty(items.item1){ // if items.item1 is empty.
      replan { // go to case1Action.
            intent {
              goal : case1Action
              value : ~~~~~
            }
          }
    }else{ // else
      replan { // go to case2Action.
            intent {
              goal : case2Action
              value : ~~~~~
            }
          }
    }
  }

或者我想select根据输出值查看。(其实这就是问题的目的)

output (items){
    if(items.item1 == "goFirstCase"){
      // First case view
    }else{
      // Second case view
    }
  }

在您的情况下,您不需要 on-empty 实际操作,而是使用 template-macro-def,如 https://corp.bixbydevelopers.com/dev/docs/dev-guide/developers/refining-dialog.dialog-macros

中简要说明
// template file one
template-macro-def (id1) {
  params {
   param (x) {
    Type (Items) .... 
}

// template file two
template-macro-def (id2) {
  // param x is type Items 
}

//view file 
result-view {
 match: Items(this) 
 // after some checking make sure is single item 
 // it is possible to use other condition like if (this.sub1 == 2) 
 if (exists(this.sub1)) {
   template-macro (id1) {
     param (x) { expression (this) }
   }
 }
 else {
   template-macro (id2) {
     param (x) { expression (this) }
   }
 }

以上是在 Bixby 中处理同一概念的不同视图的推荐方法。

on-empty 在行动中将用于重新计划或放宽某些搜索条件以避免 0 结果的目的。根据 https://corp.bixbydevelopers.com/dev/docs/reference/type/action.output.on-empty,Bixby 不支持 on-empty(key) {} 语法,并且 on-empty 仅在 output(items) 本身为空且不会检查 sub-property 的情况下适用于您的情况=17=].

我认为“select 根据输出值的不同视图”我想你的意思是你想改变屏幕上显示的内容?因为“视图”实际上由对话框、布局和 conversation-drivers 组成。 https://bixbydevelopers.com/dev/docs/dev-guide/developers/building-views.views

对于大多数用例,实际上只有一个 result-view 会被使用,并且视图的三个内容中的任何一个都可以根据您的首选条件进行更改,如上述答案所示。

在一个视图中,您可以使用这三个块定义三个不同的组件:message 用于对话框,render 用于布局,conversation-drivers

使用你的例子,

//in a result-view
message {
    if (items.item1 == "firstCase") {
        template-macro (firstCase-result-dialog) {//enter params}
    }
}
render {
    if (size(items) > 1) {
        list-of (items) {
            where-each (item) {
                if (item == "firstCase") {
                    layout-match (item) {
                        mode (Summary)
                    }
                    // OR use layout-macro
                    layout-macro (firstCase-result-summary-thumbnail-card) {//enter params}
                }
            }
        }
    }
}

当然可以在 conversation-drivers 上完成类似的条件工作。

另一种选择。 要使用 'on-empty' 块,您可以使用 'throws - error'

在动作模型中,

output (items) {
  throws {
    error (case1ActionError) {
      on-catch {
        replan {
          intent {
            goal : case1Action
            value : ~~~~~
          }
        }
      }
    }
    error (case2ActionError) {
      on-catch {
        replan {
          intent {
            goal : case2Action
            value : ~~~~~
          }
        }
      }
    }
  }
}

并且,在js代码中,

if (error condition1) {
  throw fail.checkedError('case 1 error', 'case1ActionError')
} else if (error condition2) {
  throw fail.checkedError('case 2 error', 'case2ActionError')
}
  • 关于fail,参考https://bixbydevelopers.com/dev/docs/reference/JavaScriptAPI/fail#failcheckederrormessage-errorid-errorobj