2016-01-16 23 views
0

我試圖填充一個下拉框,從方法,通過祕銀的觀點呈現被稱爲它的模塊之外下拉的視圖列表(不知道這個術語是正確的,但外面包含視圖,模型和控制器的屬性)。祕銀 - 如何填充從API

這個Chrome擴展增加了一個新的領域,以現有的頁面,這取決於用戶選擇,下拉框應刷新有關所選項目的項目。我可以進入獲取新項目列表的階段,但我無法獲得下拉列表以重新繪製新對象。

下面示出了被插入現有頁面內的模塊:

var ItemsList = { 
    model: function() { 
    this.list = function (id) { 
    var d = m.deferred() 
    // Calls Chrome extension bg page for retrieval of items. 
    chromeExt.getItems(pId, function (items) { 
     // Set default values initially when the controller is called. 
     if (items.length === 0) { 
     items = [ 
      {name: 'None', value: 'none'} 
     ] 
     } 
     d.resolve(items || []) 
    }) 
    return d.promise 
    } 
    }, 

    controller: function() { 
    this.model = new ItemsList.model() 

    this.index = m.prop(0) 

    this.onchange = function (e) { 
    console.info('ctrl:onchange', e.target) 
    } 

    // Initialise the drop down list array list. 
    this.dropDownItemsList = m.prop([]); 

    // This sets the default value of the drop down list to nothing by calling the function in the model, 
    // until the user selects an item which should populate the drop down list with some values. 
    this.getItems = function(pId) { 
     this.model.list(pId).then(function (data) { 
     this.dropDownItemsList(data) 
     m.redraw() 
     }.bind(this)) 
    } 

    this.getItems(0); 
    }, 

    view: function (ctrl) { 
    var SELECT_ID = 'record_select' 
    return vm.Type() ? m('div', [ 
     m('.form__item', [ 
     m('.label', [ 
      m('label', { 
      htmlFor: SELECT_ID 
      }, 'ID') 
     ]), 
     m('.field', [ 
      m('select#' + SELECT_ID, { 
       onchange: ctrl.onchange.bind(ctrl) 
      }, 
      ctrl.dropDownItemsList().map(function (it, i) { 
       return m('option', { 
       value: it.value, 
       checked: ctrl.model.index === i 
       }, it.name) 
      }) 
     ), 

     ]) 
     ]), 
    ]) : null 
    } 
} 

而且它使用 m.mount("element name here", ItemsList);

它檢查以查看是否項已改變的代碼安裝使用中的突變觀察者,並且每當它檢測到某個字段的更改時,它都會調用一個方法來獲取新值。我可以看到返回值有我的新項目。

我嘗試了各種不同的方法試圖更新下拉列表,首先嚐試設置「this.list」與我有的新項目列表,或試圖在控制器上創建可返回的方法當突變觀察者觸發時我可以調用它。

獲取新項目後,如何使下拉列表顯示已檢索的新項目?

我已經閱讀過指南,它顯示了正在運行的控制器或模型中的函數 - 但只有當它們已經被定義爲已經在視圖中使用它們時(例如,在調用該方法的視圖上有一個onclick方法)遠遠我不知道如何更新或從模塊外部調用方法。

有沒有辦法實現上述或不同的方法,我應該這樣做?

回答

0

一些更多的研究祕銀是如何工作後,好像這不是可以調用組件中定義的任何功能。

由於這一點,我已經移動模型中的組件的外側(所以現在它只有在控制器和所限定的視圖)和結合使用該模型組件的外側的視圖。

現在要求其更新模型(也就是現在的訪問來自其他地方的代碼),並重繪顯示了我所需要的正確值的功能。

0

如果我理解正確的話,你需要有兩個變量來存儲您的清單,一個用於存儲舊列表和一個用於存儲更新的列表,以便您可以隨時映射的更新之一,轉到您的舊之一,如果您需要。

下面是一個下拉列表的簡單實現,其中包含一些更新和搜索的方法。您可以使用這些方法即時更新列表。

var MythDropDown = function(list) { 
 
    if (Array.isArray(list)) 
 
    this.list = list; 
 
    else 
 
    list = []; 
 
    if (!(this instanceof MythDropDown)) 
 
    return new MythDropDown(list); 
 

 
    var self = this; 
 
    this.selected = { 
 
    name: list[0], 
 
    index: 0 
 
    }; 
 
    this.list = list; 
 
}; 
 

 
MythDropDown.prototype.view = function(ctrl) { 
 
    var self = this; 
 
    return m('select', { 
 
     config: function(selectElement, isinit) { 
 
     if (isinit) 
 
      return; 
 
     self.selectElement = selectElement; 
 
     self.update(self.list); 
 
     }, 
 
     onchange: function(e) { 
 
     self.selected.name = e.target.value; 
 
     self.selected.index = e.target.selectedIndex; 
 

 
     } 
 
    }, 
 

 
    this.list.map(function(name, i) { 
 
     return m('option', name); 
 
    })); 
 
}; 
 

 
MythDropDown.prototype.getSelected = function() { 
 
    return (this.selected); 
 
}; 
 

 
MythDropDown.prototype.update = function(newList) { 
 

 
    this.list = newList; 
 
    this.selectElement.selectedIndex = 0; 
 
    this.selected.name = newList[0]; 
 
    this.selected.index = 0; 
 
}; 
 

 
MythDropDown.prototype.sort = function() { 
 
    this.list.sort(); 
 
    this.update(this.list); 
 
}; 
 

 
MythDropDown.prototype.delete = function() { 
 
    this.list.splice(this.selected.index, 1); 
 
    this.update(this.list); 
 

 
}; 
 

 
var list = ['test option 1', 'test option 2']; 
 
var myList = new MythDropDown(list); 
 

 
var main = { 
 
    view: function() { 
 
    return m('.content', 
 
     m('button', { 
 
      onclick: function() { 
 
      var L1 = ['Banana', 'Apple', 'Orange', 'Kiwi']; 
 
      myList.update(L1); 
 
      } 
 
     }, 
 
     'Fruits'), 
 
     m('button', { 
 
      onclick: function() { 
 
      var L1 = ['Yellow', 'Black', 'Orange', 'Brown', 'Red']; 
 
      myList.update(L1); 
 
      } 
 

 
     }, 
 
     'Colors'), 
 
     m('button', { 
 
      onclick: function() { 
 

 
      myList.sort(); 
 
      } 
 

 
     }, 
 
     'Sort'), 
 
     m('button', { 
 
      onclick: function() { 
 

 
      myList.delete(); 
 
      } 
 

 
     }, 
 
     'Remove Selected'), 
 

 
     m('', m.component(myList), 
 
     m('', 'Selected Item: ' + myList.selected.name, 'Selected Index: ' + myList.selected.index) 
 

 
    ) 
 

 
    ); 
 
    } 
 
}; 
 

 
m.mount(document.body, main);
<script src="https://cdnjs.cloudflare.com/ajax/libs/mithril/0.2.3/mithril.min.js"></script>