Edit in JSFiddle

var SimpleListModel = function (items) {
    var self = this;
    self.items = ko.observableArray(items);
    self.itemToAdd = ko.observable("");
    //判断数组最后一个元素是否observable
    self.lastIsObservable = ko.computed(function () {
        var lastIndex = self.items().length - 1;
        var item = this.items()[lastIndex];
        return ko.isObservable(item);
    }, self);

    self.addItem = function () {
        if (self.itemToAdd() != "") {
            self.items.push(this.itemToAdd()); // Adds the item. Writing to the "items" observableArray causes any associated UI to update.
            self.itemToAdd(""); // Clears the text box, because it's bound to the "itemToAdd" observable
        }
    } // .bind(self);  // Ensure that "this" is always this view model
    self.addObservableItem = function () {
        if (self.itemToAdd() != "") {
            self.items.push(ko.observable(this.itemToAdd())); // 添加监控属性到监控数组中.
            self.itemToAdd(""); // Clears the text box, because it's bound to the "itemToAdd" observable
        }
    } // .bind(self);  // Ensure that "this" is always this view model

    self.itemsLength = ko.computed(function () {
        return self.items().length;
    });
    self.modify = function () {
        var lastIndex = self.items().length - 1;
        self.items()[lastIndex] = self.items()[lastIndex] + ' modified';
    };
    self.modifyObservable = function () {
        var lastIndex = self.items().length - 1;
        self.items()[lastIndex](self.items()[lastIndex]() + ' modified');
    };
    self.items.subscribe(function (newVal) {
        alert(newVal.length);
    });
};
var viewModel1 = new SimpleListModel(["Alpha", "Beta", "Gamma"]);
ko.applyBindings(viewModel1, document.getElementById("Demo1"));
<h1>演示 KnockOut Observable Arrays 功能</h1>
<hr />
<ul>
 <li  class="Point">
    1、<b  class="PointTitle">理解<span class="KeyWord">"Observable Array"</span>的用法</b><br />
        <ul class="PointDesc">
            <li>Observable Array具有js内置Array的所有特性(push,pop等)</li>
            <li>它可以跟踪array对象个数的变化,动态更新UI</li>
            <li>可以<span class="KeyWord">手动订阅数组变化事件</span>进行处理</li>
        </ul>
        <div  class="PointDemo" id="Demo1">
                New item:
                <input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' />
                <input type="button" data-bind="enable: itemToAdd().length > 0,click:addItem" value="添加普通元素"></input>
                <input type="button" data-bind="enable: itemToAdd().length > 0,click:addObservableItem" value="添加监控元素"></input>
                <p>Your items:</p>
                <select multiple="multiple" style=" width:60px; height:100px;" data-bind="options: items"> </select>
                <span>列表中元素个数:<span data-bind="text:itemsLength"></span></span>
          
                <input type="button" data-bind="disable:lastIsObservable,click:modify" value="修改普通数组元素"></input>
                <input type="button" data-bind="enable:lastIsObservable,click:modifyObservable" value="修改监控数组元素"></input>
        </div>
        <!--下面写一些特殊的提示信息-->
        <div class="PSFrame">
        
        <ul>
            <li>1、获取监控数组数据长度,要使用array().length,因为实际上监控数组也是一个对象,他内部保存了数组数据</li>
            <li>2、监控数组本身只负责监控<span class="KeyWord">数组元素个数的变化</span>,某个元素内容本身的变化由元素自己负责监控</li>
            <li>3、本例中,直接添加普通元素,点击修改普通元素的值后,界面不会同步更新。但是如果添加的是监控元素,则修改监控元素的值后,UI会同步变化</li>
            <li>4、还需要注意的是,如果数组的个数发送变化,所有数组元素都会更新,所以当再次添加元素的时候,上一次修改的数据会重新绑定</li>
        </ul>
        </div>
        <hr />
    </li>
</ul>
<hr />
/*Demo�ļ���ʽ*/
body
{
    background-color: #e3e5d4;
}
/*  ֪ʶ��    */
.Point
{
    margin: 20px,0,0,0;
}
/*  ֪ʶ�����    */
.PointTitle
{
    color:#0d8d0d;
}
/*  �ؼ���    */
.KeyWord
{
    color:Red;
}
/*  ֪ʶ������    */
.PointDesc
{
    font-family: Arial;
    font-size: 15px;
    color:#09acb8;
}
.PointDesc li
{
    margin: 10px,0,0,0;
}
/*  ֪ʶ��Demo���    */
.PointDemo
{
    border-style:double; 
    border-color:#dcd559;
    min-height:100px;
    font-family: Corbel;
    font-size: 20px;
    color: #00174f;
}
/*  ��Ҫ������ʾ����Ϣ���    */
.PSFrame
{
    border-style: dashed; 
    border-color:#78e6ef;
    font-family: Corbel;
    font-size: 20px;
    font-style:italic;
    color: #b86c00;
}
/*  ������ʾ    */
.error {
    color:Red;
    
}
/*  **********************************************************    */
/*��Ҫǿ������ʽ*/
.Notice
{
    font-weight: bold;
    font-family:Bodoni MT Black;
    color: #cd0707;
}

/*  **********************************************************    */
/*�������ʽ*/
input[type="text"]
{
    min-width:250px;
}
select
{
    min-width:400px;
}

External resources loaded into this fiddle: