0

插件Vue-Select

我想做的是,基于数据库进行搜索选择下拉输入。

所以这是我的第一个名为Ms_Location 的 SQL。

id_Loc | name_Loc
LOC0001 | Indonesia
LOC0002 | China
LOC0003 | America

我的index.php

<!DOCTYPE html>
<html>
<head>
  
</head

<body>
  <div class="form-group">
    <label for="lokasi_id" class="control-label required"><strong>Lokasi</strong></label>
    <v-select :options="lokasi_list" placeholder='Type location..'></v-select>
  </div>
  
  <script type="text/javascript" src="js/vue.js"></script>
  <script src="https://unpkg.com/vue-select@latest"></script>

  Vue.component('v-select', VueSelect.VueSelect);
  
  var app = new Vue ({
            el: '#app',
            data: {
                lokasi_select: '',
                lokasi_list: [],
            },
            // End of data

            computed: {
                get_lokasi() {
                    var list_loc = new Array();
                    list_loc = <?php include('receive_lokasi.php') ?>;
                        for(var i=0; i<list_loc.length; i++) {
                            var pushLoc = {
                                label: list_loc[i][1], value: list_loc[i][0]
                            }
                            this.lokasi_list.push(pushLoc);
                        }
                    return list_loc[0][1];
                }
            }

        })
    });
</script>
</body>
</html>

这是我的receive_lokasi.php

    <?php
    include ('koneksi.php');

    $condition = "1";
    if(isset($_GET['userid'])){
        $condition = " id=".$_GET['userid'];
    }

    $sqltran = mysqli_query($con, "SELECT id_Loc, name_Loc FROM ms_location")or die(mysqli_error($con));
    $response = array();

    while ($rowList = mysqli_fetch_array($sqltran,MYSQLI_NUM)) {                         

        $response[] = $rowList;
    }

    echo json_encode($response);
    mysqli_close($con);
?>

但是,我似乎无法获得显示的选项。这只发生在我创建get_lokasi() 之后。那么错误可能在那里?或者也许我错过了一些东西。

我试图在某处打印 lokasi_list ,是的,该值在那里,但未显示在下拉栏中。

另外,我是 Vue 的新手,所以任何帮助都会很好。谢谢!

4

2 回答 2

1

没关系..

我的错误,我没有注意到我的receive_lokasi.php代码

而不是使用 MYSQLI_NUM

while ($rowList = mysqli_fetch_array($sqltran,MYSQLI_NUM)) {                         
$response[] = $rowList;
}

我应该使用MYSQLI_ASSOC,如此处所述。

while ($rowList = mysqli_fetch_array($sqltran,**MYSQLI_ASSOC**)) {                         
$response[] = $rowList;
}

之后改变这个

<v-select :options="lokasi_list" placeholder='Type location..'></v-select>

对此

<v-select label='nama_Location' :options="lokasi_list" placeholder='Type location..'></v-select>

之后,一切正常。

于 2018-10-21T06:46:28.673 回答
0

Vue 的计算属性通常不用于填充 Vue 数据属性,它们通常采用一个或多个数据属性并将它们组合成不同的东西以供模板使用。

在您的代码中,您尝试在计算属性“get_lokasi”中填充 vue 数据属性“lokasi_list”,但您从未在模板中的任何位置调用“get_lokasi”,因此 lokasi_list 保持为空。

解决这种情况的另一种方法是使用 vue 方法通过 ajax 调用使用 axios 之类的方式从 php 后端获取数据,您通常会在 vue 应用程序的 created 生命周期事件中使用该方法来尽快获取数据.

例如

<script>
    Vue.component('v-select', VueSelect.VueSelect);

    var app = new Vue({
      el: '#app',
      data: {
        lokasi_select: '',
        lokasi_list: [],
      },
      created: function() {
        this.fetchLocations();
      },
      methods: {
        fetchLocations: function() {
          axios.get('/api/locations-end-point')
            .then((response) => {
              this.lokasi_list = response.data //might need to change this to match how your php is returning the json
            })
            .catch((error) => {
              //handle the error
            })
          }
        }
    });
</script>

很抱歉提到这一点,但在你的 php 中你有:

if(isset($_GET['userid'])){
    $condition = " id=".$_GET['userid'];
}

看起来您打算将它用作 sql 的一部分,但它很容易受到 SQL 注入攻击,对不起,如果我指出您已经知道的事情。

于 2018-10-16T15:42:02.373 回答