2013-04-18 3 views
1

У меня есть функция в моей модели просмотра, которая должна изменить значение enabled в моем массиве от false до true.Изменение значения наблюдаемого символа из функции viewmodel

editclick: function (user) { 
    user.enabled = true; 
    return true; 
    } 

Если я ставлю предупреждение, чтобы увидеть изменения

user.enabled = true; 
alert(ko.toJSON(user)); 

Это показывает, что он сделал изменения, но значение привязки не изменяется.

Если я ставлю предупреждение перед изменением

alert(ko.toJSON(user)); 
user.enabled = true; 

второй раз нажать на кнопку оповещения действительно показывает значение изменилось.

Вот мой jsFiddle, а также код, который я использую.

[JS]

var myViewModel = { 
    myarray: ko.observableArray([{ 
    myname: 'Bob', 
    mysurname: 'Smith', 
    enabled: false 
    }, { 
    myname: 'John', 
    mysurname: 'Smith', 
    enabled: false 
    }]), 
    editclick: function (user) { 
    user.enabled = true; 
    alert(ko.toJSON(user)); 
    return true; 
    } 
}; 

[КОД]

<Table border="1" cellpadding="5" cellspacing="0"> 
<thead> 
    <tr> 
     <td>Button</td> 
     <td>Value</td> 
    </tr> 
</thead> 
<tbody data-bind="foreach: myarray"> 
    <tr> 
     <td> 
      <input type="button" value="Change" data-bind="click: $root.editclick" /> 
     </td> 
     <td><span data-bind="text: enabled" /> 
     </td> 
    </tr> 
</tbody> 
</Table> 

Я, кажется, что изменение не обновляет ViewModel. Есть ли возможность сделать эту работу.

Thanx

ответ

2

ko.observableArray отслеживает только добавление или удаление элемента.

Так для того, чтобы KO отслеживать изменения внутри этих пунктов и автоматически обновляет пользовательский интерфейс вам нужно сделать свойства ko.observable:

myarray: ko.observableArray([{ 
     myname: 'Bob', 
     mysurname: 'Smith', 
     enabled: ko.observable(false) 
    }, { 
     myname: 'John', 
     mysurname: 'Smith', 
     enabled: ko.observable(false) 
    }]) 

и в вашем editclick вам нужно установить enabled с: user.enabled(true); (потому что ko.observable возвращает функция)

editclick: function (user) { 
     user.enabled(true); 
     alert(ko.toJSON(user)); 
     return true; 
    } 

Demo JSFiddle.

+1

Вы сэр - джентльмен и ученый! –

Смежные вопросы