2014-01-08 2 views
0

У меня есть очень простая функция:JavaScript: Изменить массив непосредственно только в пределах своей собственной функции

var errorsViewModel = function() { 
      var self = this;     
      var _errors = ko.observableArray([]);  
      self.get = function() { 
       return _errors; 
      };  
      self.insert = function (error) { 
       _errors.push(error); 
      }; 
    } 

То, что я хочу acomplish это сделать _errors массива изменяемого непосредственно только в пределах своей собственной функции. То есть пользователи извне могут получить массив для чтения через метод get и вставить его элементы только через метод insert.

Но чтобы не быть в состоянии сделать что-то вроде этого:

var err = new errorsViewModel(); 
var array = err.get(); 
array.push('item'); 

Вместо использования интерфейса errorsViewModel:

err.insert('some error'); 

Возможно ли это?

+0

Возвращает объект, который предоставляет только функции чтения вместо того, чтобы возвращать массив как таковой – techfoobar

ответ

3

Просто скопируйте возвращенный массив:

self.get = function() { 
    return _errors.slice(0); 
}; 

Таким образом, когда get называется, вызывающий абонент может внести в него изменения, если они хотят, - но он не будет изменять оригинал.

1

Чтобы убедиться, что ваш массив недоступен из-за пределов вашей области видимости, я предлагаю вам открыть массив через ko.computed, а затем уведомить его о прослушивании на вставке.

var errorsViewModel = function() { 
    var self = this;     
    var _errors = [];  

    self.errors = ko.computed(function() { 
     return self.get(); 
    }); 

    self.get = function() { 
     return _errors.splice(0); 
    };  

    self.insert = function (error) { 
     _errors.push(error); 
     self.errors.valueHasMutated(); 
    }; 
} 
Смежные вопросы