0

私のjsでは、ここをクリックして関数を呼び出していますが、私の関数です

 function PopulateBranch(branchAreaName) {

    var nodePath = "/content/eng/phone-numbers/jcr:content/content-page/wireframe";

    $.ajax({
        data:  "action="+"getBranch"+  "&nodePath=" + nodePath +  "&nodeName=" + branchAreaName,
        url: '/bin/branchlocator/crud' , 
        dataType: 'json',
        type: 'GET',
        success: function (data) {

            self.PopulateBranch = ko.computed(function(){
                ko.utils.arrayForEach(data, function(item){
                    branchView.Branches.push(new Branch(item));
                });
            });
        },
        error: function (exception) {
            alert("fail");
        }
    });

};

ビューモデル内でこの関数を呼び出していますが、この関数を呼び出すとこのエラーが発生します

Uncaught Error: Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters. 

任意の解決策??

4

1 に答える 1

2

function PopulateBranch(branchAreaName) { ... }コード内のグローバル関数です。初めて呼び出すと、次のようになります。

  • を呼び出しますPopulateBranch("someAreaName")

  • AJAX 呼び出しを行います。

  • AJAX 呼び出しが成功すると、成功ハンドラーが呼び出され、次のコードが実行されます self.PopulateBranch = ko.computed(...);。スコープ内で呼び出される変数がないため、グローバル スコープとも呼ばれるにself解決されます。これは、このコード行が古いハンドラーを新しいハンドラーに置き換えることを意味します。window.selfwindowfunction PopulateBranch(branchAreaName) { ... }ko.computed

  • 次に を呼び出すときは、元の関数をPopulateBranch("someAreaName")呼び出すのではなく、バージョンを呼び出すことになります。PopulateBranch()ko.computed

問題を解決するには、その行を削除して、配列self.PopulateBranch = ko.computed(...);を更新する別のコードに置き換える必要があります。Branchesおそらく、これが必要なだけです:

success: function(data) {
    ko.utils.arrayForEach(data, function(item) {
        branchView.Branches.push(new Branch(item));
    });
}

ところで、あなたは の使い方を誤解していると思いますko.computed。はどちらかであってはならず、通常の関数にすることができますBranchAreaViewModel。別の観測可能な値に基づいて値を計算する場合に使用する必要があります。たとえば、観測可能な経過時間を秒単位で追跡している場合、 を使用してその経過時間の文字列表現を計算できます。ノックアウトはその文字列を自動的に再計算します。観測可能な値が変化するたびに。PopulateBranchesko.computedko.computedko.computed

于 2014-09-08T07:53:47.467 に答える