添加onclick函数以在riotjs元素

时间:2015-08-03 11:27:30

标签: javascript riot.js

从这个工作元素开始,sans-js:http://jsfiddle.net/37z1z7g1/

<star-rating></star-rating>
<script type="riot/tag">
  <star-rating>
    <div class="star-rating">
      <input class="rb0" id="Ans_1" name="numericRating" type="radio" value="0" checked="checked" />
      <input class="rb1" id="Ans_2" name="numericRating" type="radio" value="1" />
      <input class="rb2" id="Ans_3" name="numericRating" type="radio" value="2" />
      <input class="rb3" id="Ans_4" name="numericRating" type="radio" value="3" />
      <input class="rb4" id="Ans_5" name="numericRating" type="radio" value="4" />
      <input class="rb5" id="Ans_6" name="numericRating" type="radio" value="5" />
      <input class="rb6" id="Ans_7" name="numericRating" type="radio" value="6" />
      <input class="rb7" id="Ans_8" name="numericRating" type="radio" value="7" />
      <input class="rb8" id="Ans_9" name="numericRating" type="radio" value="8" />
      <input class="rb9" id="Ans_10" name="numericRating" type="radio" value="9" />
      <input class="rb10" id="Ans_11" name="numericRating" type="radio" value="10" />
      <label for="Ans_1" class="star rb0l"></label>
      <label for="Ans_2" class="star rb1l"></label>
      <label for="Ans_3" class="star rb2l"></label>
      <label for="Ans_4" class="star rb3l"></label>
      <label for="Ans_5" class="star rb4l"></label>
      <label for="Ans_6" class="star rb5l"></label>
      <label for="Ans_7" class="star rb6l"></label>
      <label for="Ans_8" class="star rb7l"></label>
      <label for="Ans_9" class="star rb8l"></label>
      <label for="Ans_10" class="star rb9l"></label>
      <label for="Ans_11" class="star rb10l last"></label>
      <div class="rating"></div>
      <div class="rating-bg"></div>
    </div>
  </star-rating>
</script>

请注意,如果您点击其中一颗星星,它会保留选定星数的“值”(单击星号4,前4颗星将在失去鼠标焦点后保持选中状态)。

当我添加一些js逻辑以便在单击一个星时运行时(为了JSFiddle的目的,用console.log替换了对父函数的调用),这就是我最终的结果:http://jsfiddle.net/0u5oLyp5/ < / p>

    function update(e) {
      this.score = parseInt(e.target.value)/2;
      if (this.score) {
        //parent.UpdateScore(this.score);
          console.log(this.score);
      }
        return true;
    }

[连同

onclick="{ update }"

添加到每个标签元素]

我有两个问题:

1)请注意,我已将单词function放在“update(e)”声明的前面,这与https://muut.com/riotjs指南中的所有示例相反,因为如果我不这样做那么我得到了

Uncaught TypeError: Cannot read property ‘target’ of undefined

因为它似乎在页面加载时运行该函数,而'e'尚未定义,而不是仅仅声明该函数。我发现这很奇怪,但我不确定我哪里出错了。

2)即使我在更新功能结束时“返回true”(重新启用默认事件),单击星标也不再保持选择,因为当鼠标失去鼠标时会以蓝色突出显示。一旦我从每个标签元素中删除“onclick ='{update}'”,选择就会再次起作用,因此我似乎无法成功触发默认事件处理程序。

是否有人能够就我出错的地方提供一些指示?

1 个答案:

答案 0 :(得分:2)

问题似乎是我将函数命名为“update”,它也是所有Riot元素中固有的内部更新函数的名称。

更新通常在安装过程中运行,因此在我的查询的第1点出现错误,因为我在安装期间运行时覆盖了默认更新功能,没有传递任何事件。因此没有未定义的“目标”。这意味着一旦我将函数名称从“update()”更改为“StarsChanged”,我就不需要在声明之前使用“function()”。

然后,这也解决了我所选择的问题,而选择未保留(在查询2中)。去吧。