2017-04-17 21 views
1

私は以下のカスタムバインディングを持っています。その星の評価、私のページの読み込みはinitと呼ばれますが、その後はinit関数のみが呼び出されます。選択した後にスターバインディングにクラスを追加するクラス "Chosen" toggleclassを持つ更新機能が必要です。私はそれが親切に示唆して問題に直面している。あなたのjsFiddleからKnockout.jsカスタムバインド "更新機能が呼び出されていません"

<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); 
    }); 
+0

更新コードは正常です。私は問題がどこか他の場所だと思う。 –

+0

ここにjsFiddleがあります。バインドの更新部分が期待通りに機能しています。あなたの時間のためのhttps://jsfiddle.net/jlspake/9do8aoeb/ –

+0

あなたの時間のための感謝、しかし、私のためのdidntの仕事、私は2ビューを持っています、私はバインディングハンドラを持って、2番目のビューで私は

、更新機能にヒットしますが、開始レーティングを選択した後、再び第2ビューに戻った後、第1ビューにリダイレクトされます。更新が行われないか、更新機能が更新されません。 2回目 –

答えて

0

、あなたのokay()機能に:

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

あなたはUIが新しい観測可能でバインドされている、観察を上書きしています。代わりに、それを変更して、代わりに既存のオブザーバブルを更新する必要があります。 like:

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

それは働いていますが、私はself.UserFeedpoints(data)をクリアできません。値 –

+0

@thanksは、あなたの時間のために、最後に働いた –

+0

私は私の他の質問の一つで私を助けてください "http://stackoverflow.com/questions/43179984/how-to-carry-the-data-from-one -viewmodel-to-another-viewmodel-knockout-js " –

関連する問題