Javascript Knockout.js自定义绑定“;未调用更新函数";

Javascript Knockout.js自定义绑定“;未调用更新函数";,javascript,jquery,knockout.js,knockout-2.0,Javascript,Jquery,Knockout.js,Knockout 2.0,我有下面的自定义绑定,它的星级,在页面加载时为我调用init和update,但是在那之后,只调用init函数而不是update函数。我需要更新的功能,其中有类“选择”toggleclass,它添加类到星型绑定后选择。我在这方面面临问题 <div data-role=view id="view1"> <div id="divstarRating" data-bind="click:selectStar"> <span id="Star" dat

我有下面的自定义绑定,它的星级,在页面加载时为我调用init和update,但是在那之后,只调用init函数而不是update函数。我需要更新的功能,其中有类“选择”toggleclass,它添加类到星型绑定后选择。我在这方面面临问题

    <div data-role=view id="view1">
    <div id="divstarRating" data-bind="click:selectStar">
    <span id="Star" data-bind="readonlyStarRating:starpoints"> </span>
    </div>
    </div>
.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);
  }

   function StarViewModel() {
    self.starpoints= ko.observable();

    self.selectStar=function(){
    window.location.href="view1"
     //here i get selected star value
      starValue=self.starpoints()

      //here i am using ajax to post star value
           $.ajax({
                type: "POST",
                dataType: "json",
                data: Model,
                url: serverUrl + 'xxx/xx/xx',
                success: function (data) {
                    $('#loading-image').hide();
                  // after susccees of post success ajax data consist of star rating value
                   self.starpoints= ko.observable(data);
                },
      }
   }

    $(document).ready(function () {
     ko.bindingHandlers.readonlyStarRating =
 {
 init: function (element, valueAccessor) {
 $(element).addClass("readonlyStarRating");
for (var i = 0; i < 5; i++)
 $("<span>").appendTo(element);
         $("span", element).each(function (index) {
         var observable = valueAccessor();
         $(this).hover(
             function () { 
 $(this).prevAll().add(this).addClass("hoverChosen") },
             function () { 
 $(this).prevAll().add(this).removeClass("hoverChosen") }
         )
      });
  },
  update: function (element, valueAccessor) {
     var observable = valueAccessor();
     $("span", element).each(function (index) {
     $(this).toggleClass("chosen", index < observable());
     });
    }
  }
    ViewModel = new StarViewModel();
    ko.applyBindings(ViewModel);
  });

.星距{
宽度:24px;
高度:24px;
背景图片:url(../star.png);
显示:内联块;
光标:指针;
背景位置:-24px 0;
}
.主演跨度{
背景位置:0;
} 
.主演:悬停跨度{
背景位置:-24px 0;
变换:旋转(-15度)比例(1.3);
}
.starting:悬停span.hoverselected{
背景位置:0;
变换:旋转(-15度)比例(1.3);
}
函数饥饿模型(){
self.starpoints=ko.observable();
self.selectStar=function(){
window.location.href=“view1”
//这里我得到了选定的星值
饥饿值=self.starpoints()
//在这里,我使用ajax发布star值
$.ajax({
类型:“POST”,
数据类型:“json”,
数据:模型,
url:serverUrl+'xxx/xx/xx',
成功:功能(数据){
$(“#加载图像”).hide();
//成功后的ajax数据由星级值组成
自星点=可观测(数据);
},
}
}
$(文档).ready(函数(){
ko.bindingHandlers.ReadOnlyStarting=
{
init:函数(元素、值访问器){
$(元素).addClass(“ReadOnlyStarting”);
对于(变量i=0;i<5;i++)
$(“”)。附加到(元素);
$(“span”,元素)。每个(函数(索引){
var可观测=valueAccessor();
$(此)。悬停(
函数(){
$(this.prevAll().add(this.addClass(“HoverSelected”)},
函数(){
$(this.prevAll().add(this.removeClass)(“hoverselected”)}
)
});
},
更新:函数(元素、值访问器){
var可观测=valueAccessor();
$(“span”,元素)。每个(函数(索引){
$(this.toggleClass(“selected”,index
从JSFIDLE,在
ok()函数中:

self.okay = function ()
{
    data = self.UserFeedpoint
    self.UserFeedpoints = ko.observable(data);
    window.location.href = "#home1"
}
您正在用新的可观察对象覆盖UI绑定到的可观察对象。您只需更改它以更新现有的可观察对象。例如:

self.okay = function ()
{
    data = self.UserFeedpoint
    self.UserFeedpoints(data);
    window.location.href = "#home1"
}

在JSFIDLE的
ok()
函数中:

self.okay = function ()
{
    data = self.UserFeedpoint
    self.UserFeedpoints = ko.observable(data);
    window.location.href = "#home1"
}
您正在用新的可观察对象覆盖UI绑定到的可观察对象。您只需更改它以更新现有的可观察对象。例如:

self.okay = function ()
{
    data = self.UserFeedpoint
    self.UserFeedpoints(data);
    window.location.href = "#home1"
}

更新代码看起来不错。我认为问题出在其他地方。这是一个JSFIDLE。绑定的更新部分按预期工作。@感谢您的时间,但它对我不起作用,我有两个视图,第一个视图中有绑定处理程序,第二个视图中有,第一次它点击更新函数,但在选择In之后g开始评级,我被重定向到第一视图,再次返回第二视图后,当我单击递增或递减时,更新不会调用或更新功能不会被调用,我不知道为什么第二次更新不起作用javascript@i有更新我的代码,我的问题是更新功能有切换选择的类,所以我需要改变所有的时间当用户选择satr Rating时,更新代码看起来不错。我认为问题出在其他地方。这是一个JSFIDLE。绑定的更新部分按预期工作。@感谢您的时间,但它对我不起作用,我有两个视图,第一个视图中有绑定处理程序,第二个视图中有,第一次点击u更新功能但在选择开始评级后,我被重定向到第一视图,再次返回第二视图后,当我单击递增或递减时,更新不会调用或更新功能不会调用,我不知道为什么第二次更新不起作用javascript@i有更新我的代码,我的问题是更新功能选择了class,因此,当用户选择satr比率时,我需要随时更改它的工作状态,但我无法清除self。UserFeedpoints(数据);value你能帮我解决另一个问题吗?@kittysarvaj我会看看它的工作状态,但我无法清除self。UserFeedpoints(数据);value你能帮我解决另一个问题吗@kittysarvaj我去看看