【问题标题】:Knockout js star rating "value not get cleared"Knockout js 星级评定“值未清除”
【发布时间】:2017-04-14 13:27:51
【问题描述】:

我正在使用 Knockout js 进行星形绑定。它仅在页面加载时第一次工作。当我第一次从 5 个开始中选择一些 2 星时,它给了我正确的值,之后该值不会被清除我无法选择任何星星。需要一些帮助。

ko.bindingHandlers.starRating = {
 init: function (element, valueAccessor) {
  console.log(valueAccessor);
   $(element).addClass("starRating");
     for (var i = 0; i < 5; i++)
      $("<span>").appendTo(element);
        $("span", element).each(function (index) {
            $(this).hover(
                function () { $(this).prevAll().add(this).addClass("hoverChosen") },
                function () { $(this).prevAll().add(this).removeClass("hoverChosen") }
            ).click(function () {
                var observable = valueAccessor();
                console.log(observable)
                observable(index + 1);
                window.localStorage.setItem("star", observable());
            });
        });
      },
      update: function (element, valueAccessor) {
        var observable = valueAccessor();
        $("span", element).each(function (index) {
            $(this).toggleClass("chosen", index < observable());
        });
      }
    };

  //HTML
  <div id="divstarRating">
  <span id="feedStar" data-bind="starRating: UserFeedpoints"> </span>
            </div>


 //css

 .starRating span {
 width: 24px;
 height: 24px;
 background-image: url(../star.png);
 display: inline-block;
 cursor: pointer;
 background-position: -24px 0;
 }

 .starRating span.chosen {
    background-position: 0 0;
 } 

.starRating:hover span {
 background-position: -24px 0;  
 transform: rotate(-15deg) scale(1.3);
 }

 .starRating:hover span.hoverChosen {
     background-position: 0 0;
     transform: rotate(-15deg) scale(1.3);
  }

【问题讨论】:

  • 一般来说,你不应该进行全局查询(比如$("&lt;span&gt;"))。你应该改用$(element).find("&lt;span&gt;")
  • 绑定没有任何问题,只有选择后无法更改值。

标签: css knockout.js knockout-2.0


【解决方案1】:

值按我的预期更新。我注释掉了 localStorage,因为这在 sn-p 中是被禁止的。

ko.bindingHandlers.starRating = {
  init: function(element, valueAccessor) {
    console.log(valueAccessor);
    $(element).addClass("starRating");
    for (var i = 0; i < 5; i++)
      $("<span>").appendTo(element);
    $("span", element).each(function(index) {
      $(this).hover(
        function() {
          $(this).prevAll().add(this).addClass("hoverChosen")
        },
        function() {
          $(this).prevAll().add(this).removeClass("hoverChosen")
        }
      ).click(function() {
        var observable = valueAccessor();
        console.log(observable)
        observable(index + 1);
        //window.localStorage.setItem("star", observable());
      });
    });
  },
  update: function(element, valueAccessor) {
    var observable = valueAccessor();
    $("span", element).each(function(index) {
      $(this).toggleClass("chosen", index < observable());
    });
  }
};

ko.applyBindings({
  UserFeedpoints: ko.observable()
});
.starRating span {
  width: 24px;
  height: 24px;
  background-color: red;
  background-image: url(https://upload.wikimedia.org/wikipedia/en/e/e5/Yellow_Star.png);
  display: inline-block;
  cursor: pointer;
  background-position: -24px 0;
}

.starRating span.chosen {
  background-position: 0 0;
}

.starRating:hover span {
  background-position: -24px 0;
  transform: rotate(-15deg) scale(1.3);
}

.starRating:hover span.hoverChosen {
  background-position: 0 0;
  transform: rotate(-15deg) scale(1.3);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div id="divstarRating">
  <span id="feedStar" data-bind="starRating: UserFeedpoints"> </span>
  <div data-bind="text: UserFeedpoints"></div>
</div>

【讨论】:

  • 是的,第一次它有效,但选择后我返回不同的 View1,然后我再次返回包含星级的视图 2,之前选择的值不清楚,我无法也选择,悬停不起作用
  • “我正在返回不同的 View1”是什么意思?
  • 我有 2 个不同的页面,第一页显示所选星级的总数,第二页显示星级(代码上方),一旦我选择星级,我将重定向回第一页,如果我重定向到第 2 页后,所选星级不明确,我无法再次选择星,悬停将不会被删除,它会保留以前选择的星
  • 不,我没有改变任何东西
  • 是的,我更改了 UserFeedpoints 的值,现在在第 2 页加载星级评分已清除该值,但现在如果我点击星标,它不会悬停,也不会被选中
猜你喜欢
  • 2014-02-21
  • 2016-07-07
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多